Reactjs useEffect是否需要依赖关系数组中的所有数据处于React状态?

Reactjs useEffect是否需要依赖关系数组中的所有数据处于React状态?,reactjs,react-hooks,use-effect,Reactjs,React Hooks,Use Effect,我在React中创建自定义钩子时遇到了我没有预料到的useffecthook的行为。我创建了一个自定义钩子,它接受一个ID数组并获取每个ID的数据,每当ID更改时,它都会再次获取,然后返回一个数组中的所有数据: const useGetItems = (ids) => { const [data, setData] = useState([]); useEffect(() => { const loadData = async () => { co

我在React中创建自定义钩子时遇到了我没有预料到的
useffect
hook的行为。我创建了一个自定义钩子,它接受一个ID数组并获取每个ID的数据,每当ID更改时,它都会再次获取,然后返回一个数组中的所有数据:

const useGetItems = (ids) => {
  const [data, setData] = useState([]);

  useEffect(() => {
    const loadData = async () => {
      const responses = ids.map((id) => fetchById(id));
      const parsed = await Promise.all(responses);
      setData(parsed);
    };
    loadData();
  }, [ids]);

  return data;
};
然而,当我使用定义为
constids=[1,2]
的id数组测试它并将它们传递到
useGetItems
时,
useffect
钩子开始无休止地循环。经过一些调试,我发现当我使用
useState
ids
置于状态时,问题就消失了。同时注释掉
setData
导致无休止的循环停止

你可以找到。您可以取消注释有问题的行,并在控制台中查看每次调用
fetchById
的日志


为什么会这样?这是因为React状态之外的数据在与React进行比较时不相等,即使它们没有更改?

出于某种原因,无论如何,无法将其作为注释发布。
我认为这是由引用相等引起的,如果主组件中的ID被声明为变量,那么将在每个渲染上创建一个新的引用,您可以提供父组件(使用钩子)的代码吗?

是的,代码是,您必须注释掉L28并取消注释L29,才能看到它以我所描述的方式运行。正如我所说的,问题是id变量在每个渲染上创建此数组的一个新实例,然后会导致设置状态一次又一次循环,这会导致无休止的循环,希望是clearYes,这很清楚,谢谢。但是,我仍然不知道为什么只有当钩子中的状态更新时才会触发它。删除L18
setData(已解析)
时,
useffect
钩子不会以无限循环结束。或者是因为当钩子的状态没有更新时,父组件的新呈现没有被调用,因此数组没有改变?据我所知,你可以认为自定义钩子中的所有代码都写在组件中,这意味着当您在customhook函数中设置state时,将触发主组件上的重新渲染器。