发生这种情况是因为
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的更多信息。



