javascript - 在 useEffect 钩子(Hook)中添加依赖导致死循环

标签 javascript reactjs react-hooks use-effect

我有一个围绕搜索栏的包装器组件,它在每次击键时获取建议,然后在选择建议或用户点击输入/搜索时进行搜索。选择搜索值后,我想将该搜索项保存到本地存储,以便我可以重点显示它,就像谷歌一样。这是我的组件的一个片段

export default function App() {
    const [results, resultsLoading, resultsError, setParams] = useFetch();
    const [suggestions, ,suggestionsError, setSuggestionsParams] = useFetch();
    const [showSearchSuggestions, setShowSearchSuggestions] = useState<boolean>(true);
    const [recentSearches, setRecentSearches] = useLocalStorage('recent_searches', []);
    const [searchAttributes, setSearchAttributes] = useState<SearchAtrributesInterface>({
        value: '',
        fetchType: SEARCH_FETCH_TYPES.SUGGESTIONS
    });

    useEffect(() => {
        const getSearchSuggestions = () => setSuggestionsParams(getAutoCompleteURL(searchAttributes.value));
        const getSearchResults = () => {
            setParams(getSearchURL(searchAttributes.value));
            setShowSearchSuggestions(false);
        };

        if (searchAttributes.value) {
            if (searchAttributes.fetchType === SEARCH_FETCH_TYPES.SUGGESTIONS) {
                getSearchSuggestions();
            } else {
                getSearchResults();
                setRecentSearches([searchAttributes.value, ...recentSearches])
            }
        }
    }, [searchAttributes, setParams, setSuggestionsParams]);

    return ( ... );
};

这工作正常,但随后我收到了 linting 警告:React Hook useEffect 缺少依赖项:“recentSearches”和“setRecentSearches”。要么包括它们,要么删除依赖数组 react-hooks/exhaustive-deps。将这两个添加到依赖项数组后,我陷入了无限循环,因为当然 recentSearches 的状态正在设置,导致它重新呈现等等。我想找到一个解决方案来反对添加 //eslint-disable-next-line 因为我觉得我做的事情确实有问题。有谁知道我可以做些什么来防止无限循环和防止 linter 警告?

最佳答案

它有两个作用。

由于您希望利用现有的状态值来更新相同的状态,因此您应该使用回调方法

setRecentSearches(prevRececentSearches => ([searchAttributes.value, ...prevRececentSearches]));

此外,当您完全确定您没有遗漏任何依赖项时,您可以禁用警告。请查看此帖子了解更多详情:How to fix missing dependency warning when using useEffect React Hook?

关于javascript - 在 useEffect 钩子(Hook)中添加依赖导致死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58643805/

相关文章:

javascript - 如何将 React-native 与后端服务器集成?

reactjs - 无法读取未定义的属性 'params',React

function - 如何在React功能组件中访问ag-Grid API(useState hook)?

javascript - 为什么 useMemo 不起作用?我用错了吗?

javascript - 将字符串转换为键不带引号的 python 或 json 字典

javascript - 使用 Javascript 或 jQuery 插入 Google Adwords 转化跟踪

javascript - Autodesk forge 在浏览器中将几何体添加到模型中

javascript - 有没有办法在reactjs中全局捕获未处理的promise异常?

javascript - 如何在 React Native 中为获取 API 请求创建进度条?

javascript - 如何在页面加载时发出请求, react Hook