React中的setInterval更新状态但不识别时间何时为0

Posted

技术标签:

【中文标题】React中的setInterval更新状态但不识别时间何时为0【英文标题】:setInterval updating state in React but not recognizing when time is 0 【发布时间】:2020-12-15 15:22:31 【问题描述】:

我正在练习 React useState hooks 来制作一个每十秒重置一次的测验计时器。我现在拥有的是每秒更新状态,并且 p 标签相应地呈现。但是当我 console.log(seconds) 每次显示 10 时,因此条件 (seconds === 0) is never met 。在 Chrome 的 React DevTools 中,状态也在相应地更新。我在这里做错了什么?

import React, useState  from 'react';

function App() 

  const [seconds, setSeconds] = useState(10);

  const startTimer = () => 
    const interval = setInterval(() => 
      setSeconds(seconds => seconds - 1);

      // Logs 10 every time
      console.log(seconds)

      // Never meets this condition
      if (seconds === 0) 
            clearInterval(interval)
      
    , 1000);
  

  return (
    <div>
      <button onClick=() => startTimer()></button>
      // updates with current seconds
      <p>seconds</p>
    </div>
  )


export default App;

【问题讨论】:

【参考方案1】:

这是因为 setSeconds 在每个刻度上都使用新变量更新状态,但初始引用(秒 === 10)仍然指向初始设置变量。这就是为什么它停留在 10 => 初始参考。 要获取当前值,您必须在 setSeconds 变量(以秒形式传递)中检查它,如下所示:

const startTimer = () => 
    const interval = setInterval(() => 
      setSeconds(seconds => 
        if(seconds < 1) 
          clearInterval(interval);
          return 10;
        
        return seconds - 1;
      );
    , 1000);
  

这是一个有效的sandbox

您还应该在一个函数中将变量重命名为两次不同的名称(秒)。

【讨论】:

谢谢!说得通。所以在 setSeconds 部分,我可以使用任何名称来代替“秒”,对吗? 是的,任何名字都可以。您也可以使用秒数,但不鼓励使用,以免造成混淆。

以上是关于React中的setInterval更新状态但不识别时间何时为0的主要内容,如果未能解决你的问题,请参考以下文章

React.js/Redux:Reducers 中的 setInterval 和 clearInterval

状态正在更新但不显示[重复]

使用 setInterval 和 clearInterval 设置状态的问题

如何在 React 功能组件中正确设置 setInterval 计时器?

React之状态(state)与生命周期

反应钩子:新状态值未反映在 setInterval 回调中