首页 > web前端 > js教程 > 为什么我的 React 状态不在 `setInterval` 内更新?

为什么我的 React 状态不在 `setInterval` 内更新?

Mary-Kate Olsen
发布: 2024-12-02 19:43:11
原创
1008 人浏览过

Why Doesn't My React State Update Inside `setInterval`?

在 setInterval 中使用 React State Hook 时状态不更新

在 React 的新 Hooks 功能中,时钟组件设计用于显示时间值每秒都在增加。尽管计时器运行,时间值仍停留在 1。

问题的原因

这个问题的根源在于 setInterval 的闭包。此闭包中的回调函数只能访问时间变量的初始值。由于 useEffect() 函数在第一次渲染后不会执行,因此回调不会接收后续时间值。

时间值访问

因此,时间变量始终setInterval 的回调中携带初始值 0。

解决方案:使用 State 的回调形式Hooks

与传统的 setState 方法类似,状态钩子提供两个选项:第一个接受更新的状态,而回调形式接收当前状态。要解决此问题,建议使用回调形式并在 setState 回调中递增之前获取最新的状态值。

替代方法

Dan Abramov 的博客文章深入研究了 setInterval 与钩子的使用,为这个问题提供了不同的解决方案。强烈建议阅读它。

更新的代码

以下代码演示了正确的实现:

function Clock() {
  const [time, setTime] = React.useState(0);
  React.useEffect(() => {
    const timer = window.setInterval(() => {
      setTime(prevTime => prevTime + 1); // <-- Change this line!
    }, 1000);
    return () => {
      window.clearInterval(timer);
    };
  }, []);

  return (<div>Seconds: {time}</div>);
}

ReactDOM.render(<Clock />, document.querySelector('#app'));
登录后复制

以上是为什么我的 React 状态不在 `setInterval` 内更新?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板