封装倒计时自定义react hook

ts 复制代码
import { useEffect, useState, useRef } from 'react'

const useCountDown = (initialTime = 60) => {
  let timerRef = useRef<any>(null)
  const [countdown, setCountdown] = useState(initialTime);
  const [isCounting, setIsCounting] = useState(false);

  const startCountDown = () => {
    if (!isCounting) {
      setCountdown(initialTime)
      setIsCounting(true)
      timerRef.current = setInterval(() => {
        setCountdown((prev) => {
          if (prev <= 1) {
            clearInterval(timerRef.current)
            setIsCounting(false)
            return initialTime
          }
          return prev - 1
        }
        )
      }, 1000)
    }
  }

  useEffect(() => {
    return () => {
      if (timerRef.current) {
        clearInterval(timerRef.current);
      }
    };
  }, []);

  return {
    countdown,
    isCounting,
    startCountDown
  }
}

export default useCountDown

使用

ts 复制代码
  const {
    countdown,
    isCounting,
    startCountDown
  } = useCountDown()
  
 const handleGetCode = () => {
    if(isCounting)return
    startCountDown()
  }
  
  ...
  
<AtButton type='primary' onClick={handleGetCode}>{isCounting ? `${countdown}秒后重试` : '获取验证码'}</AtButton>
相关推荐
九州~空城22 分钟前
C++中map和set的封装
java·前端·c++
H轨迹H23 分钟前
DVWA靶场JavaScript Attacks漏洞low(低),medium(中等),high(高),impossible(不可能的)所有级别通关教程
javascript·网络安全·渗透测试·dvwa·web漏洞
椒盐大肥猫28 分钟前
axios拦截器底层实现原理
前端·javascript
夕水40 分钟前
我的2024-人生须为有益事
前端·年终总结
明月看潮生1 小时前
青少年编程与数学 02-006 前端开发框架VUE 08课题、列表渲染
前端·javascript·vue.js·青少年编程·编程与数学
前端要努力1 小时前
30而立,月哥的2024年终总结,小亏几百万
前端·后端·面试
hawk2014bj1 小时前
Vue3 中的插槽
前端·javascript·vue.js
码农小菲1 小时前
vue3-dom-diff算法
开发语言·javascript·算法
有心还是可以做到的嘛1 小时前
Vue3中的watch函数
前端·javascript·vue.js
三天不学习1 小时前
Vue Router v3.x 迁移到 v4.x(两者的区别)【路由篇】
前端·javascript·vue.js·router