[英]React hook useEffect runs continuously forever/infinite loop
我正在尝试新的React Hooks的useEffect
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
从返回的呼叫useState
在useEffect
,阵营将再次呈现该组件,并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.