n-countdown 倒计时
用于活动截止、可暂停的相对时长与累计计时。时长输入统一为毫秒,天/时/分/秒可附加;截止日期优先。修改输入开始新一轮,修改显示格式或样式保留本轮进度。
平台兼容性
| App | H5 | 微信小程序 | 支付宝小程序 | 百度小程序 | 头条小程序 | QQ小程序 |
|---|---|---|---|---|---|---|
| √ | √ | √ | × | × | × | × |
API
属性
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| time | 初始毫秒数,与 day/hour/minute/second 相加;down 为剩余时长,up 为已累计时长 | number | 0 |
| day | 初始天数,与其他时长输入相加 | number | 0 |
| hour | 初始小时数,可超过 23 | number | 0 |
| minute | 初始分钟数,可超过 59 | number | 0 |
| second | 初始秒数,可包含小数 | number | 0 |
| datetime | 截止日期(Date 或带时区的日期字符串),非空时优先于时长输入;仅 down 使用 | Date / string / null | null |
| mode | down 倒计时,up 累计计时 | enum | down |
| max-time | 累计计时的毫秒上限,0 表示不限;仅 up 使用 | number | 0 |
| auto-start | 挂载或重置后自动开始;修改为 false 暂停,true 继续 | boolean | true |
| format | 显示格式:DD/HH/mm/ss/S/SS/SSS 或 {d}/{h}/{m}/{s}/{ms};缺失高位单位累计至下一个显示单位 | string | HH:mm:ss |
| pad-zero | 天时分秒补足两位;毫秒按模板位数补零 | boolean | true |
| hide-zero | 隐藏前导零单位及其分隔符,最后一个单位始终保留 | boolean | false |
| millisecond | 以 30ms 刷新真实毫秒;关闭时按秒刷新并向上取整剩余秒数 | boolean | false |
| keep-alive | 组件销毁后进度不重置,重建时按真实时间补算,反复进出页面不再从初始值重跑(活动/秒杀倒计时);无后台定时器 | boolean | false |
| keep-running | 进度保存到本地,杀进程重开或刷新后接着走而非重新计时(订单支付剩余时间);存储失败派发 error | boolean | false |
| unique-key | 保留进度的键,未传时全部实例共用默认键;同页多实例需各自独立保留时传不同键(秒杀场次、订单号等) | string | n-countdown |
| item-style | 数字段容器行内样式(底色、边框、宽高);宽度应能容纳超过两位的累计值 | string | |
| text-style | 数字段文字行内样式(颜色、字号);固定盒内不要设置 line-height | string | |
| separator-style | 分隔符文字行内样式(颜色、字号) | string | |
| millisecond-style | 毫秒文字行内样式,在 textStyle 后应用 | string | |
| custom-class | 根节点额外类名,类须定义在组件样式表内 | string | |
| custom-style | 根节点行内样式 | string |
事件
| 事件名 | 说明 | 回调参数 |
|---|---|---|
| change | 初始化、重置与时间变化时触发,参数为 NCountdownData(total 为真实毫秒) | NCountdownData |
| start | 从未运行或暂停进入运行时触发,参数为 NCountdownData | NCountdownData |
| pause | 手动暂停运行时触发,参数为 NCountdownData;页面隐藏不触发 | NCountdownData |
| reset | 调用 reset 后触发,参数为 NCountdownData;自动开始时随后触发 start | NCountdownData |
| finish | 到达终点或主动 finish 时触发,每轮一次,参数为 NCountdownData | NCountdownData |
| error | 输入或保留状态错误时触发,参数为 NCountdownError;输入错误停止计时 | NCountdownError |
插槽
| 插槽名 | 说明 |
|---|---|
| default | 整体替换。参数 time: NCountdownData、items: NCountdownItem[],另直接提供 days/hours/minutes/seconds/milliseconds 数值字段;字段为标准分解值,items 为格式模板的累计显示值 |
| item | 逐项替换。参数 item: NCountdownItem(value 格式化文字、unit 单位标识、isSeparator 是否分隔符)、index、time;保留数字块容器样式 |
方法与状态
| 名称 | 说明 |
|---|---|
| start() / resume() | 开始或继续:暂停后从原进度继续,完成后从初始值开启新一轮;运行中重复调用无效果 |
| pause() | 相对时长冻结;截止日期只暂停刷新,原截止时刻不延后 |
| reset() | 按当前 props 丢弃进度重新初始化,随后按 autoStart 决定是否开始 |
| finish() | 主动结束当前一轮,保留当前值并派发一次 finish;自然结束倒计时为 0,累计计时为上限 |
| isRunning | 是否处于运行状态;隐藏期间逻辑继续计时但不进行显示刷新 |
| current | 当前 NCountdownData(total、days、hours、minutes、seconds、milliseconds,全部为 number) |
格式与边界
- DD/HH/mm/ss/SSS 对应天/时/分/秒/三位毫秒,S/SS 对应十分之一秒/百分之一秒;{d}/{h}/{m}/{s}/{ms} 是等价占位符。模板中的其他内容作为分隔符原样显示,空格式为空展示。
- 未显示高位单位累计至下一显示单位:3661000ms 用 HH:mm:ss 显示 01:01:01,用 mm:ss 显示 61:01,用 ss 显示 3661。hideZero 仅隐藏前导零及分隔符,最后一单位仍显示零。
- 秒级倒计时向上取整显示,不会在剩余 999ms 时提前显示 0;millisecond 开启后显示真实毫秒,每约 30ms 刷新,调度周期不改变真实到期时刻。
- 时长输入非负且有限,毫秒取整数;非法数值、无效日期、up 配 datetime 均触发 error 并停止。默认零时长挂载不自动触发 finish;手动 start 或已过期截止日期触发一次 finish。
- 适合进度不能重置的场景:活动倒计时反复进出页面用 keep-alive,订单支付剩余时间跨重启用 keep-running;同页多实例需各自独立保留时用不同 unique-key 区分,单实例零配置即可。保存的进度恢复时校验计时配置,配置变化开始新一轮;暂停和已完成状态也保留,恢复后 start 从初始值重开;reset 明确覆盖保存的状态。存储读取、解析、写入失败通过 error 显式报告并从当前输入开始。
- 页面或应用隐藏时停止定时刷新,返回补算实际经过时间。没有后台唤醒能力,finish 在可执行回调时派发,业务有效期由服务端判定。设备系统时间变更会影响计时,应以业务提供的服务器校准截止时刻为准。
实现说明
| 机制 | 参考做法 | 本组件做法 | 分歧理由 |
|---|---|---|---|
| 输入 | 总时长、分单位时长、截止日期分别提供 | 全部保留,毫秒统一计算,日期优先 | 避免多套计值链路,输入优先级明确 |
| 计时 | 定时器逐秒递减或递增 | 时间值加时间戳锚点,定时器只触发刷新 | 调度延迟不会累计成误差,隐藏后无需逐次补帧 |
| 手动控制 | 开始、停止、续播、重置、结束 | start/pause/resume/reset/finish,暂停与完成分开,完成后 start 重开 | 防止暂停被当成结束事件,重复调用幂等,完成后再次开始对齐验证码重发等场景 |
| 格式与单位显隐 | 占位模板或独立单位开关,省略高位时累计 | 两种已有模板语法共用解析器,缺失单位累计 | 用模板表达单位选择,保留全部显示能力,避免多组开关相互冲突 |
| 毫秒 | 真实毫秒刷新或独立数字轮播装饰 | 30ms 刷新真实毫秒,S/SS/SSS 可选精度 | 避免视觉毫秒与实际时间脱节,不使用 CSS 关键帧或原生插件 |
| 隐藏零与补零 | 前导零隐藏、数值补零 | hideZero/padZero,最后一单位恒保留 | 结束状态仍可读,累计单位不截断 |
| 正向计时 | 独立累计计时器,初始值与上限 | mode=up 与 maxTime,共用同一时钟 | 功能来自累计计时参考,单一引擎覆盖两方向 |
| 销毁保留 | 销毁后继续、唯一键区分 | 状态快照与锚点,重建补算;本次运行与本地保存分别提供 | 销毁后不遗留定时器,恢复保留任务进度 |
| 插槽 | 整体作用域插槽或逐项插槽 | default 与 item 两级均保留 | 整体布局与局部换样式均可接管 |
| 样式 | 数字段、分隔符、毫秒独立尺寸颜色及底色边框 | 主题令牌、itemStyle/textStyle/separatorStyle/millisecondStyle | 遵循库内定制通道,原样式能力均有对应入口 |
| 结构更新 | 按显示列表渲染单位 | 根 key 仅依赖单位和分隔符结构,数值原地更新 | 保证 App 动态结构切换重绘,秒与帧刷新不重建 |
令牌:--n-countdown-item-width / padding-x / padding-y / background / border-width / border-color / radius / separator-margin / font-size / color / separator-size / separator-color。文字颜色默认显式引用主题文本色;数字块以最小宽度和内容自适应,允许累计小时、分钟与天数超过两位,不钉死文字高度与行高。