文档详情

React Native 中实现倒计时功能.docx

发布:2025-05-15约2.02千字共3页下载文档
文本预览下载声明

React?Native?中实现倒计时功能

目录正文首次实现最终实现示例

正文

在ReactNative,该如何实现一个倒计时功能呢?

首次实现

表面看来很简单,譬如像下面这样:

consttimer=useRefReturnTypetypeofsetInterval|null(null)

const[count,setCount]=useState(0)

conststart=()={

setCount(10)

timer.current=setInterval(()={

setCount((count)=count-1)

},1000)

useEffect(()={

if(count===0timer.current!==null){

clearInterval(timer.current)

timer.current=null

},[count])

这段代码大多数情况下是可以正常工作的。但是你将应用退到后台,稍后再进入看看。

很有可能,原本应该结束的倒计时,还在工作。

这是因为ReactNative应用退到后台后,世界会停止。为了适应这点,我们应该先设定希望倒计时结束的时间,然后每隔一秒计算一次当前时间与结束时间之差(秒)。

此外,当应用退到后台时,应该清除定时器。

最终实现

考虑上述种种,倒计时的实现并不简单。

我们可以封装一个自定义Hook来提供可复用的倒计时功能。

import{useAppState}from@react-native-community/hooks

import{useCallback,useEffect,useRef,useState}fromreact

exportfunctionuseCountdown(seconds=30){

consttimer=useRefReturnTypetypeofsetInterval|null(null)

const[target,setTarget]=useStateDate|null(null)

const[count,setCount]=useStatenumber(0)

constappState=useAppState()

conststart=useCallback(()={

setTarget(add(newDate(),seconds))

},[seconds])

conststop=useCallback(()={

setTarget(null)

setCount(0)

},[])

useEffect(()={

if(target===null||appState!==active){

return

setCount(diff(newDate(),target))

timer.current=setInterval(()={

setCount(diff(newDate(),target))

},1000)

return()={

if(timer.current){

clearInterval(timer.current)

timer.current=null

},[target,appState])

useEffect(()={

if(count===0){

stop()

},[count,stop])

return{count,start,stop}

functionadd(date:Date,seconds:number){

returnnewDate(date.getTime()+seconds*1000)

functiondiff(now:Date,target:Date){

returnMath.max(

Math.trunc((target.getTime()-now.getTime())/1000+0.5),

示例

这里有一个示例,供你参考。

以上就是ReactNative中实现倒计时功能的详细内容,更多关于ReactNative倒计时的资

显示全部
相似文档