怎么用React+Typescript实现倒计时的功能
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍"怎么用React+Typescript实现倒计时的功能",在日常操作中,相信很多人在怎么用React+Typescript实现倒计时的功能问题上存在疑惑,小编查阅了各式资料,整理出简
千家信息网最后更新 2025年02月02日怎么用React+Typescript实现倒计时的功能
这篇文章主要介绍"怎么用React+Typescript实现倒计时的功能",在日常操作中,相信很多人在怎么用React+Typescript实现倒计时的功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么用React+Typescript实现倒计时的功能"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
import { useEffect, useRef } from 'react'/** * interTerval hooks组件 * @param fn 执行函数 * @param delay 时间 * @param options immediate为true时,先立即执行一次fn函数后再执行定时器 */function useInterval( fn: () => void, delay: number | null | undefined, options?: { immediate?: boolean }): void { const immediate = options?.immediate const timerRef = useRef<() => void>() timerRef.current = fn useEffect(() => { if (delay === undefined || delay === null) { return } if (immediate) { timerRef.current?.() } const timer = setInterval(() => { timerRef.current?.() }, delay) return () => { clearInterval(timer) } }, [delay])}export default useInterval
实现倒计时Hook
import { useState, useEffect, useRef, useMemo } from 'react'import { useInterval } from './'interface ITime { /** 当前时间 */ currentTime?: number /** 结束时间 */ endTime?: number /** 另一种方式,不传当前时间和结束时间,直接传时间差 */ differTime?: number}interface ICbTime { d: number h: number m: number s: number}/** * 倒计时hooks * @param options 时间对象 * @param cb 倒计时完成时执行的回调函数 * @param noImmediate 时间传进来满足执行回调条件时,是否立即执行回调,默认false执行 */function useCountDown( options: ITime, cb?: () => void, noImmediate?: boolean): ICbTime { const { currentTime = 0, endTime = 0, differTime = 0 } = options const [diffTime, setDiffTime] = useState(0) /** 组件接收到参数时的时间 */ const entryTime = useRef(0) /** 当前倒计时要求的时间差 */ const maxTime = useRef (0) /** 是否可以执行回调 */ const isImplementCb = useRef(false) useEffect(() => { if (!isImplementCb.current) { isImplementCb.current = true } if ((currentTime > 0 && endTime > 0) || differTime > 0) { entryTime.current = new Date().getTime() maxTime.current = differTime > 0 ? differTime : endTime - currentTime if (maxTime.current <= 0 && noImmediate) { isImplementCb.current = false } setDiffTime(maxTime.current) } }, [currentTime, endTime, differTime]) useInterval( () => { const curtTimes = new Date().getTime() const TimeDifference = curtTimes - entryTime.current setDiffTime(maxTime.current - TimeDifference) }, diffTime <= 0 ? null : 1000 ) const timeObj = useMemo(() => { const time = diffTime > 0 ? diffTime / 1000 : 0 const d = Math.floor(time / (24 * 60 * 60)) const h = Math.floor((time / (60 * 60)) % 24) const m = Math.floor((time / 60) % 60) const s = Math.ceil(time % 60) if (diffTime <= 0 && isImplementCb.current) { /** * setTimeout用于解决react报错问题: * annot update during an existing state transition (such as within `render`). * Render methods should be a pure function of props and state. */ setTimeout(() => { cb?.() }, 0) } return { d, h, m, s } }, [diffTime]) return timeObj || ({} as ICbTime)}export default useCountDown
写个demo看一下效果?
const TimeArea = () => { const { d, h, m, s } = useCountDown( { currentTime: 1631262176333, endTime: 1831062176333 }, () => { alert('倒计时结束') } ) return (距离任务结束 {d}天{h < 10 ? '0' + h : h}: {m < 10 ? '0' + m : m}:{s < 10 ? '0' + s : s}) }
到此,关于"怎么用React+Typescript实现倒计时的功能"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
时间
倒计时
功能
学习
函数
时间差
更多
组件
帮助
实用
接下来
任务
参数
定时器
对象
效果
文章
方式
方法
条件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
si 软件开发的风险
安全狗可以安装服务器吗
服务器安全链连失败
网络安全宣传 好的标题
微信的合元软件开发怎么删
网络安全资讯中心电话
数据库表名 驼峰
数据库查询操作实验步骤
网络安全活动月2020年
镇江江苏高性能服务器供应商家
lucene 数据库索引
建材商城开发装修软件开发
永劫无间服务器好吗
公网直连服务器怎么做安全
NCRE三级网络技术编程题
数据库combobox
代理服务器设置线路
浙江省网上认证服务器云主机
数据库NLR
杭州软件开发app贵吗
安全的网游服务器租用
服务器故障代表什么意思
网络安全产业细分领域
c+软件开发方案
我的世界竹龙服务器ip
嘉定区智能化软件开发采购
网易mc服务器透视挂
我的世界服务器提示移动太快
分布式实时数据库多少钱
做软件开发流程