javascript - react Hook : new state value not reflecting in setInterval callback

标签 javascript reactjs react-hooks

我有一个函数 React 组件,它有一个从 10000 开始到 0 的计数器。

我在组件安装期间使用 useEffect Hook 设置一个 setInterval 回调。然后回调更新计数器状态。

但不知道为什么,count 值一直没有减少。每次回调运行时,count 为 10000。

(我正在使用 react 和 react-dom 版本 16.8.3)

函数组件如下:

import React, { useState, useEffect, useRef } from 'react'

const Counter = () => {
  const timerID = useRef()
  let [count, setCount] = useState(10000)

  useEffect(() => {
    timerID.current = setInterval(() => {
      //count here is always 10000
      if (count - 1 < 0) {
        setCount(0)
      } else {
        setCount(count - 1)
      }
    }, 1)
  }, [])

  return <h1 className="counter">{count}</h1>
}

export default Counter

这是 codesandbox 的链接:link

最佳答案

您需要观察 count 的变化,并清理您的 useEffect():

useEffect(() => {
    timerID.current = setInterval(() => {
      if (count - 1 < 0) {
        setCount(0)
      } else {
        setCount(count - 1)
      }
    }, 100)

    return () => clearInterval(timerID.current);
  }, [count])

正如@Pavel 提到的,Dan Abramov 解释了为什么 here .

关于javascript - react Hook : new state value not reflecting in setInterval callback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55563287/

相关文章:

javascript - 我如何遍历 Array.prototype 函数

javascript - window.open 页面加载

javascript - React 函数在构造函数中调用后未设置状态

mysql - TypeError - indexOf 不是函数(使用 MySQL 进行数据搜索)

reactjs - 使用 Webpack 在 Electron 项目中使用外部目录中的组件

javascript - 使用带有空 dom 树 (<></>) 的子组件/同级组件来获取数据?是还是不是?

javascript - XML、Javascript - 无法调用 null 的 getElementsByTagName 方法

javascript - jQuery 获取数据属性不起作用

javascript - Firebase 具有 useeffect 清理功能

ruby-on-rails - 为什么我的 axios get 调用一遍又一遍地重复使用 React.useEffect 从 Rails 后端获取?