繁体   English   中英

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

[英]React hook useEffect runs continuously forever/infinite loop

我正在尝试新的React HooksuseEffect API,它似乎在无限循环中永远运行! 我只希望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 的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM