定时器中使用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 时更新。


目录
相关文章
|
18天前
|
前端开发 测试技术 开发工具
探索前端框架React Hooks的优势与应用
本文将深入探讨前端框架React Hooks的优势与应用。通过分析React Hooks的特性以及实际应用案例,帮助读者更好地理解和运用这一现代化的前端开发工具。
|
2月前
|
前端开发 JavaScript UED
使用React Hooks优化前端应用性能
本文将深入探讨如何使用React Hooks来优化前端应用的性能,重点介绍Hooks在状态管理、副作用处理和组件逻辑复用方面的应用。通过本文的指导,读者将了解到如何利用React Hooks提升前端应用的响应速度和用户体验。
|
17天前
|
前端开发
探索React Hooks:一种全新的组件逻辑管理方式
React Hooks是React 16.8版本引入的一项新功能,它改变了我们编写React组件的方式。本文将从Hooks的起源讲起,逐步分析Hooks的优势,并通过具体示例展示Hooks在组件逻辑管理中的应用,旨在帮助读者更好地理解和运用React Hooks。
|
28天前
|
前端开发 JavaScript
使用React Hooks实现简单的计数器应用
使用React Hooks实现简单的计数器应用
|
28天前
|
前端开发 JavaScript
【边做边学】React Hooks (二)——useEffect Hook
【边做边学】React Hooks (二)——useEffect Hook
|
28天前
|
前端开发
【边做边学】系统解读一下React Hooks
【边做边学】系统解读一下React Hooks
|
2月前
|
存储 缓存 前端开发
【React】Hooks面试题集锦
本文集合一些React的Hooks面试题,方便读者以后面试查漏补缺。作者给出自认为可以让面试官满意的简易答案,如果想要了解更深刻,可以点击链接查看对应的详细博文。在此对链接中的博文作者非常感谢🙏。
59 1
|
2月前
|
前端开发
利用React Hooks优化前端状态管理
本文将深入介绍如何利用React Hooks优化前端状态管理,包括Hooks的概念、使用方法以及与传统状态管理方式的对比分析,帮助前端开发人员更好地理解和应用这一现代化的状态管理方案。
|
2月前
|
移动开发 JavaScript 前端开发
vue/react项目刷新页面出现404的原因以及解决办法
vue/react项目刷新页面出现404的原因以及解决办法
213 0
|
2月前
react+typescript给state和props定义指定类型
react+typescript给state和props定义指定类型
17 1