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

一、引言

倒计时器(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 模式的切换、定时器的生命周期管理,以及用户交互的防误操作设计。时间类工具的开发还涉及一些微妙的用户体验问题(比如后台运行、通知提醒等),这些问题在需要高可靠性的生产级应用中需要认真对待。

相关推荐
nice先生的狂想曲1 分钟前
javascript高级程序设计(六)——2026.9.5
前端·javascript
光影少年11 分钟前
如何做大型React+RN 项目架构设计、目录规范
前端·react native·react.js
一位正在转型AI全栈的前端工程师16 分钟前
AI 全栈学习之旅 -Week 8:从单 Agent 到多 Agent 协作:LangGraph 实战与记忆持久化
前端·python
用户9210802628617 分钟前
Promise 和 async/await:从用途到执行机制
前端
yyt36304584135 分钟前
KLineChartQuant:GLSL 的精度问题及 RTC 解法
前端·vue.js·react.js·交互·图形渲染·webgl·数据可视化
HarmonLTS44 分钟前
智盾 WAF v8.2 Ultra|下一代 Web 应用防火墙
前端
এ慕ོ冬℘゜1 小时前
前端实战:基于jQuery递归实现通用树形组织菜单(可直接复用)
前端·javascript·jquery
计算机魔术师1 小时前
英伟达据报洽谈向 Mira Murati 的 Thinking Machines Lab 投资 25 亿美元
前端
变与不变8061 小时前
js函数与封装详细解答
前端·javascript·vue.js
南雨北斗2 小时前
Vue 3 项目中的拦截器的作用和写法(动态设置响应头适配表单文件上传)
前端