HarmonyOS5 NEXT 倒计时功能实现
·
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:在实现倒计时功能的时候,我们一般会用setinterval()来实现,可能会出现一种时间精度问题,所以今天我们使用一种鸿蒙系统自带的TextTimer组件实现:
使用场景:文本计时器组件,常用于倒计时、运动计时等场景
提示:以下是本篇文章正文内容,下面案例可供参考
一、TextTimer 组件和setInterval的区别
| 对比维度 | TextTimer 组件 | setInterval |
|---|---|---|
| 本质 | 鸿蒙内置 UI 组件(渲染 + 计时一体) | JS 逻辑定时器,纯逻辑,无界面 |
| 使用目的 | 单纯展示倒计时时间,只做计时 UI 展示 | 自定义复杂业务逻辑(倒计时判断、接口轮询、弹窗、蓝牙、数据校验) |
| 时间精度 | 毫秒级原生渲染,计时稳定,无累积误差 | 受主线程阻塞影响,长时间运行会累积时间偏移 |
| 变量维护 | 无需自己定义剩余秒数变量,组件内部托管时间 | 必须手动定义 @State 变量存储剩余时间,自己做减法 |
| 时间格式化 | 内置format,一键 ss / mm:ss / hh:mm:ss |
需要自己手写函数拼接时分秒字符串 |
| 自动停止 | 支持设置总时长,时间到自动停止计时 | 必须手动判断数值,调用 clearInterval 销毁 |
| 生命周期销毁 | 页面销毁自动停止,无内存泄漏风险 | 页面退出必须手动 clearInterval,否则内存泄漏、后台持续执行 |
| 回调能力 | 仅提供计时时间回调,适合单纯展示 | 回调内可写任意复杂逻辑:字符串匹配、弹窗、震动、网络请求、分支判断 |
| 适用场景 | 简单静态倒计时 UI(活动倒计时、纯计时展示) | 你的业务:车辆倒计时 + 判断预估8秒有车、匹配字符串、触发提醒、多分支业务逻辑 |
二、使用步骤
1.setInterval代码实现
private estArriCountdownTimerId:number|null=null
@State countdownTime:number=10
estimatedArrivalCountdown(){
if(this.estArriCountdownTimerId !==null){
this.clearTimer();
}
this.estArriCountdownTimerId=setInterval(()=>{
this.countdownTime--;
if(this.countdownTime <= 0){
this.clearTimer();
}
},1000);
}
// 清除定时器封装
clearTimer() {
if (this.estArriCountdownTimerId !== null) {
clearInterval(this.estArriCountdownTimerId)
this.estArriCountdownTimerId = null
}
}
2.TextTimer的代码实现
@Entry
@Component
export struct VideoPage {
private estArriCountdownTimerId:number|null=null
@State countdownTime:number=10
getMainTitleText(content:string){
const reg= /^预估(\d+)秒有车$/;
const result=reg.exec(content);
if(result){
return true
}
return false;
}
aboutToDisappear(): void {
this.clearTimer();
}
private countDownTextTimerController=new TextTimerController()
@State private timerModifier: TextTimerModifier = new TextTimerModifier('',false);
@Builder
textTimerBuilder(textInfo:string) {
// 马上用车
TextTimer({
isCountDown: true,
count: 60 * 1000,
controller: this.countDownTextTimerController
})
.width('100%')
.contentModifier(this.timerModifier)
.format('ss')
.onTimer((utc: number, elapsedTime: number) => {
console.log('文本定时器是'+utc+'===='+elapsedTime)
})
.onAppear(()=>{
const result= this.getMainTitleText(textInfo);
this.timerModifier.textInfo=textInfo
this.timerModifier.isCountDown=result
if(result){
this.countDownTextTimerController.start()
}
})
}
build() {
NavDestination(){
Column(){
this.textTimerBuilder('预估60秒有车');
}.width('100%').height('100%').backgroundColor(Color.Pink).justifyContent(FlexAlign.Center)
}
}
}
class TextTimerModifier implements ContentModifier<TextTimerConfiguration>{
textInfo:string
isCountDown:boolean
constructor(textInfo:string,isCountDown:boolean) {
this.textInfo=textInfo
this.isCountDown=isCountDown
}
applyContent(): WrappedBuilder<[TextTimerConfiguration]> {
return wrapBuilder(buildTextTimer);
}
}
@Builder
function buildTextTimer(config: TextTimerConfiguration){
Text(
(config.contentModifier as TextTimerModifier).isCountDown
?
`预估${(Math.max(config.count / 1000 - config.elapsedTime, 0))}秒有车就来了`
:`${(config.contentModifier as TextTimerModifier).textInfo ?? ''}`)
.id('taxi_order_calling_title')
.fontWeight(500)
.fontSize(18)
.lineHeight(24)
}
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了TextTimer和setinterval的使用方法和场景,大家可以根据使用场景选择不同的倒计时实现方案。
更多推荐


所有评论(0)