当前位置: 首页 > 面试题库 >

React hook useEffect永远连续/无限循环运行

陆晓博
2023-03-14
问题内容

我正在尝试新的React Hooks的useEffectAPI,它似乎一直在无限循环中运行!我只希望回调useEffect运行一次。这是我的代码供参考:

单击“运行代码段”,以查看将“ Run useEffect”字符串无限打印到控制台。

function Counter() {

  const [count, setCount] = React.useState(0);



  React.useEffect(() => {

    console.log('Run useEffect');

    setCount(100);

  });



  return (

    <div>

      <p>Count: {count}</p>

    </div>

  );

}



ReactDOM.render(<Counter />, document.querySelector('#app'));


<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>

<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>



<div id="app"></div>

问题答案:

发生这种情况是因为useEffect在每次渲染后都会触发,这是Counter()在这种情况下无状态功能组件的调用。当你做一个setX从返回的呼叫useStateuseEffect,阵营将再次呈现该组件,并useEffect再次运行。这将导致无限循环:

Counter()→交通useEffect()→交通setCount()→交通Counter()→交通useEffect()→交通…(循环)

要使您的useEffect运行一次,请传递一个空数组[]作为第二个参数,如下面的修订代码段所示。

第二个参数的目的是告诉React数组参数中的任何值何时更改:

useEffect(() => {
  setCount(100);
}, [count]); // Only re-run the effect if count changes

您可以将任意数量的值传递到数组中,并且useEffect仅在其中任何一个值更改时才运行。通过传入一个空数组,我们告诉React不要跟踪任何更改,只能运行一次,有效地模拟componentDidMount

function Counter() {

  const [count, setCount] = React.useState(0);



  React.useEffect(() => {

    console.log('Run useEffect');

    setCount(100);

  }, []);



  return (

    <div>

      <p>Count: {count}</p>

    </div>

  );

}



ReactDOM.render(<Counter />, document.querySelector('#app'));


<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>

<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>



<div id="app"></div>

阅读有关useEffect的更多信息。



 类似资料:
  • 我正在尝试新的React Hooks的API,它似乎一直在无限循环中运行!我只希望中的回调运行一次。下面是我的代码供参考:

  • 我试图创建一个简单的while循环,它将运行start、stop、quit和help命令。“启动”、“停止”和“帮助”将仅显示一些打印文本。在它们运行之后,我希望它继续执行另一个命令。然而,在退出时,我希望整个程序停止。

  • 我有一个我研究过的问题,但我没有找到任何令人信服的答案。如果您想每2小时左右循环运行一个程序,当然,我知道任何人都可以使用windows调度程序或类似的东西,是否会在无限循环中运行程序并每2小时左右使用“继续”语句来防止它中断(StackOverflow)?

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 在连接上创建infinte循环!很奇怪,直到现在才发生。我不知道出了什么问题。我试图重建包,我复制一些代码从旧的源代码和相同的结果...

  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类