功能反应组件中的无限重渲染

时间:2020-09-22 20:13:35

标签: reactjs asynchronous axios infinite-loop use-effect

我试图设置变量“工作区”的状态,但是当我控制台记录数据时,出现了无限循环。我在useEffect()内部调用axios“ get”函数,并在此循环之外调用控制台日志,因此我不知道是什么触发了所有重新渲染。在this question中找不到我的特定问题的答案。这是我的代码:

srcRect

是否有人看到导致重新渲染的原因?谢谢!

3 个答案:

答案 0 :(得分:2)

效果钩子在每个渲染周期运行,并且没有依赖项数组的效果钩子将在每个渲染周期执行其回调。如果效果回调更新了状态,即proposals,则将另一个渲染循环加入队列,从而创建渲染循环。

如果要在组件安装时只运行一次效果,请使用空的依赖项数组。

useEffect(() => {
  getItems();
}, []);

如果您希望它仅在特定时间运行,例如match参数更新,则在数组中包含一个依赖项。

useEffect(() => {
  getItems();
}, [match]);

答案 1 :(得分:1)

您对useEffect的使用不正确。如果您的依赖项数组为空,则每次状态数据发生任何更改时都会调用它。因此,您的useEffect被调用导致setProposals,然后再次导致useEffect运行,依此类推

尝试

useEffect(() => {
    getItems();
  } , []);   // an empty array means it will be called once only

答案 2 :(得分:0)

我认为是以下内容:useEffect应该有第二个参数[],以确保它仅执行一次。即:

  useEffect(() => {
    getItems();
  }, []);

否则,setProposal将修改触发重新渲染的状态,该状态将调用useEffect,这将进行异步调用,从而setProposal,...