我正在试用新的 React Hooks 并有一个带有计数器的时钟组件,该计数器应该每秒增加一次。但是,该值不会增加超过 1。
function Clock() {
const [time, setTime] = React.useState(0);
React.useEffect(() => {
const timer = window.setInterval(() => {
setTime(time + 1);
}, 1000);
return () => {
window.clearInterval(timer);
};
}, []);
return (
<div>Seconds: {time}</div>
);
}
ReactDOM.render(<Clock />, 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>
原文由 Yangshun Tay 发布,翻译遵循 CC BY-SA 4.0 许可协议
原因是因为回调传入
setInterval
的闭包仅访问time
第一次渲染中的变量,它无法访问新的time
后续渲染中的值,因为useEffect()
没有被第二次调用。time
在setInterval
回调中始终具有 0 值。就像你熟悉的
setState
一样,state hooks有两种形式:一种是获取更新状态,一种是传入当前状态的回调形式。你应该使用第二种形式并阅读setState
回调中的最新状态值,以确保您在递增状态值之前拥有最新状态值。