我的搜索栏组件中的 useEffect() 导致无限循环,我无法理解

useEffect() in my search Bar component causes an infinite loop, that I cannot understand

我是 React-Native 的新手,正在学习有关 react-native 的课程。 这个 git 中心链接到我的存储库代码有问题(无限循环)我在以下问题中描述。 我花了 12 个多小时试图解决这个问题。如果可以,请帮我解决这个问题。

https://github.com/JohnyClash/mealsToGo

useEffect in question

以上图片目录:'src/features/restaurants/components/search.components.js'

    useEffect(() => {
    search(searchKeyword);
}, []);

以上代码创建了一个反馈循环,导致应用不断从模拟 api 获取位置信息,returns 加载到屏幕,然后快速重新加载广告 infinitum.Its 预期目的是 运行 一次组件挂载以引起一次默认搜索。相反,search.component 运行 中的这个 useEffect() 会重复它的回调。 useEffect 未跟踪已更改的依赖项,并给定 [] 一个空数组代替依赖项

useEffect(callback,dependencies)
useEffect(callback,[])

useEffect 的这种语法不应该在挂载后仅 运行 一次,如果有更新则不应该再次 运行 吗?如果我的理解是正确的,这个使用效果怎么可能是运行ning死循环?

试试这个:

useEffect(() => {
  search(keyword)
}, [keyword])

这个无限循环的问题是由这个位置对象引起的 here,可能是因为每次重新呈现 LocationContext(完成搜索或更新状态)时,它都会创建一个新的实例location 对象,再次调用 useEffect,然后再次搜索,再次调用 useEffect 时重新创建 location 对象,进行新的搜索,更新一些状态并重新创建 location 对象...

有无限循环问题的代码:

    useEffect(() => {
        console.log(location)
        if (location) {
            const locationString = `${location.lat},${location.lng}`;
            retrieveRestaurants(locationString);
        }
    }, [location]);

如果你这样做,可能会解决这个问题:

  useEffect(() => {
    if (location?.lat && location?.lng) {
      const locationString = `${location.lat},${location.lng}`;
      retrieveRestaurants(locationString);
    }
  }, [location?.lat, location?.lng]);

还要小心setTimeout, and not

Tip: useEffect依赖一定要避免object, array or function,必要时需要用useMemo或useCallback

记忆