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


目录
相关文章
|
6天前
|
前端开发 JavaScript
深入理解并实践React Hooks —— useEffect与useState
深入理解并实践React Hooks —— useEffect与useState
27 1
|
1月前
|
设计模式 存储 前端开发
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
|
2月前
|
前端开发 JavaScript 安全
TypeScript在React Hooks中的应用:提升React开发的类型安全与可维护性
【7月更文挑战第17天】TypeScript在React Hooks中的应用极大地提升了React应用的类型安全性和可维护性。通过为状态、依赖项和自定义Hooks指定明确的类型,开发者可以编写更加健壮、易于理解和维护的代码。随着React和TypeScript的不断发展,结合两者的优势将成为构建现代Web应用的标准做法。
|
2天前
|
前端开发 JavaScript 开发者
深入探索React Hooks的魔力
深入探索React Hooks的魔力
22 10
|
1月前
|
前端开发
React组件实例更改state状态值(四)
【8月更文挑战第14天】React组件实例更改state状态值(四)
26 1
React组件实例更改state状态值(四)
|
1月前
|
前端开发 JavaScript
React组件实例state(三)
【8月更文挑战第14天】React组件实例state(三)
25 1
React组件实例state(三)
|
22天前
|
JavaScript 前端开发 安全
[译] 使用 TypeScript 开发 React Hooks
[译] 使用 TypeScript 开发 React Hooks
|
23天前
|
前端开发 JavaScript API
React Hooks 的使用场景有哪些?
【8月更文挑战第25天】
38 2
|
24天前
|
存储 前端开发 JavaScript
React Hooks的魔法:如何在组件世界里施展响应式与复用的魔法
【8月更文挑战第27天】React Hooks 是自 React 16.8 起新增的功能,支持开发者在无需类组件的情况下利用 React 的状态管理和特性。本文通过实例展示了多种核心 Hooks 的使用方法:`useState` 用于实现响应式状态管理;`useEffect` 处理副作用操作,如数据获取等;`useMemo` 和 `useCallback` 有助于性能优化;`useRef` 则提供对 DOM 的直接引用。
27 2
|
6天前
|
前端开发 JavaScript
react hooks深拷贝后无法保留视图状态
react hooks深拷贝后无法保留视图状态
12 0

热门文章

最新文章