React hook useEffect 连续运行 forever/infinite 循环
React hook useEffect runs continuously forever/infinite loop
我正在试用新的 React Hooks 的 useEffect
API,它似乎永远保持 运行ning,处于无限循环中!我只想要 useEffect
到 运行 的回调一次。这是我的代码供参考:
点击"Run code snippet"可以看到"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()
函数。当您在 useEffect
中执行从 useState
返回的 setX
调用时,React 将再次渲染该组件,并且 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 的 useEffect
API,它似乎永远保持 运行ning,处于无限循环中!我只想要 useEffect
到 运行 的回调一次。这是我的代码供参考:
点击"Run code snippet"可以看到"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()
函数。当您在 useEffect
中执行从 useState
返回的 setX
调用时,React 将再次渲染该组件,并且 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 的更多信息。