react-Hook倒计时hook

我们平常注册账号的时候会有发送验证码的需求,为了减少过多的请求,我们一般限制60s发一次,这个需求也很平常,但在react中之前我并没有写过,就简单的研究了一下,把该需求封装成了一个hook

代码

import { useCallback, useEffect, useRef, useState } from "react";
//initCount是倒计时时长,默认是10s,callBack是开始执行的回调函数,endBack是结束时执行的函数
export function useCountDown(
  initCount = 10,
  callBack = () => {},
  endBack = () => {}
) {
//初始化定时器id
  const timeId = useRef<{ id: number }>({ id: 0 });
  //初始化倒计时
  const [count, setCount] = useState(initCount);
  //初始化是否禁用
  const [isdisable, setIsdisable] = useState(false);
  //开始,执行该函数之后会开启倒计时
  const start = () => {
    setCount(initCount);
    setIsdisable(true);
    timeId.current.id = window.setInterval(() => {
      setCount((count) => count - 1);
    }, 1000);
  };
  //   首先清除定时器
  useEffect(() => window.clearInterval(timeId.current.id), []);
  //   判断是否需要清除
  useEffect(() => {
    if (count !== initCount || isdisable) {
      callBack();
    }
    if (count === 0) {
      clearInterval(timeId.current.id);
      setCount(initCount);
      endBack();
      setIsdisable(false);
    }
  }, [callBack, count, initCount, endBack, isdisable]);
  //对外暴露三个属性,开始执行函数,当前倒计时时间,是否禁用
  return { start, count, isdisable };
}

使用

import React, { useState } from 'react'
import { useCountDown } from '../../hooks/utils';
import { Button } from 'antd';

export default function text() {
    const [codeMessage, setCodeMessage] = useState("获取验证码");
    const { start, count, isdisable } = useCountDown(
        60,
        () => {
            setCodeMessage(`${count}s后重新获取`);
        },
        () => {
            setCodeMessage("获取验证码");
        }
    );
    function getCode() {
        start();
    }
    return (
        
) }

以上就是我封装的倒计时hook。

你可能感兴趣的:(react.js,前端,前端框架)