提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:在实现倒计时功能的时候,我们一般会用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的使用方法和场景,大家可以根据使用场景选择不同的倒计时实现方案。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐