【共创季稿事节】 倒计时器:时分秒选择器与定时器的协同工作

一、引言

倒计时器(Countdown Timer)是最常见的计时工具之一,广泛用于会议提醒、烹饪计时、考试倒计日等场景。与正向计时的秒表不同,倒计时器需要先设定一个目标时长,然后从该时长开始递减到零。

二、双模式设计

本倒计时器采用"设置模式"和"运行模式"的双模式设计:

if (!this.isSet) {

// 设置模式:选择时/分/秒

} else {

// 运行模式:显示倒计时

}

2.1 设置模式

用户通过三个按钮组(时、分、秒)设定目标时长。

2.2 运行模式

显示倒计时数字,提供暂停/继续和重置操作。

三、时分秒选择器

3.1 选择器设计

每个时间单位(时/分/秒)使用上下箭头按钮调整数值:

@Builder pickerItem(label: string, value: number, max: number, onChange: (v: number) => void) {

Column() {

Text(label).fontSize(12)

Button(String(value)).fontSize(20)

Row() {

Button('▲').onClick(() => onChange(value + 1 > max ? 0 : value + 1))

Button('▼').onClick(() => onChange(value - 1 < 0 ? max : value - 1))

}

}

}

上箭头加 1,下箭头减 1,超出范围则循环(如 59 秒加 1 变为 0)。

3.2 时间值选择的范围控制

每个时间单位都有其合理的取值范围:

单位 取值范围 循环规则

时 0-23 23→0, 0→23

分 0-59 59→0, 0→59

秒 0-59 59→0, 0→59

这种"循环"行为模仿了真实计时器的调节方式,用户无需反复点击来增大数值。

3.3 启动计时

Button('▶ 开始倒计时')

.onClick(() => {

this.remaining = this.hours * 3600 + this.minutes * 60 + this.seconds;

if (this.remaining > 0) {

this.isSet = true;

this.isRunning = true;

this.timerId = setInterval(() => {

if (this.remaining > 0) this.remaining--;

else { clearInterval(this.timerId); this.isRunning = false; }

}, 1000);

}

})

四、倒计时状态管理

4.1 暂停/继续

if (this.isRunning) {

clearInterval(this.timerId);

this.isRunning = false;

} else {

this.timerId = setInterval(() => {

if (this.remaining > 0) this.remaining--;

else { clearInterval(this.timerId); this.isRunning = false; }

}, 1000);

this.isRunning = true;

}

4.2 时间到提示

if (this.remaining === 0) {

Text('⏰ 时间到!')

.fontSize(24)

.fontColor('#E74C3C')

}

五、时间格式化

formatCountdown(sec: number): string {

let h = Math.floor(sec / 3600);

let m = Math.floor((sec % 3600) / 60);

let s = sec % 60;

return ${h < 10 ? '0' : ''}${h}:${m < 10 ? '0' : ''}${m}:${s < 10 ? '0' : ''}${s};

}

六、总结

倒计时器的核心难点不在于功能逻辑本身,而在于"设置"与"运行"两种 UI 模式的切换、定时器的生命周期管理,以及用户交互的防误操作设计。时间类工具的开发还涉及一些微妙的用户体验问题(比如后台运行、通知提醒等),这些问题在需要高可靠性的生产级应用中需要认真对待。

相关推荐
TrisighT1 小时前
Electron 鸿蒙 PC 上做本地搜索,Fuse.js 比 SQLite 快 6 倍——但我愣是选了最慢的方案
electron·sqlite·harmonyos
独守一片天2 小时前
HarmonyOS 6.1.0 Call Service 来电识别与安全通信怎么设计?
安全·华为·harmonyos
奶油mm2 小时前
公司技术债堆积如山,我一人之力用 Vue3 偷换了整个前端架构
前端·vue.js
用户938515635072 小时前
深入理解 JavaScript 中的 this 与数据存储的奥秘
前端·javascript
AI创界者2 小时前
【硬核教程】鸿蒙 HarmonyOS 4.2 / 4.3 完美配置 GMS 运行环境(纯净版/不弹窗/全机型通用)
华为·harmonyos
JNX_SEMI2 小时前
AT2659 L1频段多模卫星导航低噪声放大器技术解析
前端·单片机·嵌入式硬件·物联网·硬件工程
Profile排查笔记4 小时前
指纹浏览器环境异常排查:Fingerprint、Profile、Proxy、Session 和 Task Log 怎么看
前端·人工智能·后端·自动化
京韵养生记4 小时前
【无标题】
java·服务器·前端
大气的小蜜蜂5 小时前
领域层的服务
java·前端·数据库