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

我正在尝试新的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 hook useEffect永远连续/无限循环运行 的全部内容, 来源链接: utcz.com/qa/434312.html

回到顶部