定时器中使用React hooks的 state 值不变的解决办法

简介: 定时器中使用React hooks的 state 值不变的解决办法

需求:做一个倒计时按钮,在“发送验证码”后开始60的倒数计时。


使用 React hooks 的形式:


// 倒计时按钮状态
  const [loading, setLoading] = useState(false)
  const [count, setCount] = useState(60)
  useEffect(() => {
    if (loading) {
      const btnClock = setInterval(() => {
        if (count < 1) {
          setLoading(false)
          setCount(60)
          clearInterval(btnClock)
        }
        setCount(prevCount => prevCount - 1)
      }, 1000)
    }
  }, [loading])


问题:


判断 if (count < 1) 中的count 因为某种原因成了闭包(原因我很疑惑?),每次更新时,并不会从60 - 59 - 58。。。而是始终保持60。这样的话倒计时永不会结束。


解决:


使用 useRef hook 存储每次count的变化值,再在 setInterval 中引用 countRef.current


// 倒计时按钮状态
 const [loading, setLoading] = useState(false)
 const [count, setCount] = useState(60)
 const countRef = useRef(count)
 useEffect(() => {
   countRef.current = count
 }, [count])
 useEffect(() => {
   if (loading) {
     const btnClock = setInterval(() => {
       if (countRef.current < 1) {
         setLoading(false)
         setCount(60)
         clearInterval(btnClock)
       }
       setCount(prevCount => prevCount - 1)
     }, 1000)
   }
 }, [loading])


说明:


useEffect hook 也是顺序执行,为 countRef 在每次render 时更新。


目录
相关文章
|
2月前
|
前端开发 JavaScript
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
84 4
|
1月前
|
前端开发 JavaScript API
探究 React Hooks:如何利用全新 API 优化组件逻辑复用与状态管理
本文深入探讨React Hooks的使用方法,通过全新API优化组件逻辑复用和状态管理,提升开发效率和代码可维护性。
|
1月前
|
前端开发
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
25 3
|
1月前
|
前端开发 JavaScript
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
|
1月前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
40 2
|
2月前
|
前端开发 开发者
React 提供的其他重要 Hooks
【10月更文挑战第20天】React 提供了一系列强大的 Hooks,除了 `useRef` 之外,还有许多其他重要的 Hooks,它们共同构成了函数式组件开发的基础。
41 6
|
1月前
|
前端开发 JavaScript
React Hooks 深入解析
React Hooks 深入解析
28 0
|
1月前
|
前端开发
React Hooks:从基础到进阶的深入理解
React Hooks:从基础到进阶的深入理解
32 0
|
1月前
|
缓存 前端开发 开发者
深入理解React Hooks,打造高效响应式UI
深入理解React Hooks,打造高效响应式UI
34 0
|
2月前
|
前端开发 JavaScript 开发者
React Hooks
10月更文挑战第13天
43 1