284 lines
7.3 KiB
Markdown
284 lines
7.3 KiB
Markdown
# Bricks 时间组件技术文档
|
||
|
||
本模块提供两个基于 `bricks` 框架的时间显示类组件:`TimePassed`(计时器)和 `Countdown`(倒计时器),并包含一个通用的时间格式化工具函数。这些组件可用于构建需要时间展示功能的 UI 界面。
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [1. 核心工具函数](#1-核心工具函数)
|
||
- [`bricks.formatTime(seconds)`](#bricksformattimeseconds)
|
||
- [2. TimePassed 类(正向计时器)](#2-timepassed-类正向计时器)
|
||
- [继承关系](#继承关系)
|
||
- [构造函数](#构造函数)
|
||
- [方法](#方法)
|
||
- [3. Countdown 类(倒计时器)](#3-countdown-类倒计时器)
|
||
- [继承关系](#继承关系-1)
|
||
- [配置选项 (`opts`)](#配置选项-opts)
|
||
- [事件](#事件)
|
||
- [构造函数](#构造函数-1)
|
||
- [方法](#方法-1)
|
||
- [4. 工厂注册](#4-工厂注册)
|
||
- [5. 使用示例](#5-使用示例)
|
||
|
||
---
|
||
|
||
## 1. 核心工具函数
|
||
|
||
### `bricks.formatTime(seconds)`
|
||
|
||
将秒数转换为 `HH:MM:SS` 格式的字符串,不足两位用前导零填充。
|
||
|
||
#### 参数
|
||
|
||
| 参数名 | 类型 | 描述 |
|
||
|---------|--------|--------------|
|
||
| seconds | number | 时间(以秒为单位) |
|
||
|
||
#### 返回值
|
||
|
||
- `{string}`:格式化后的时间字符串,格式为 `HH:MM:SS`。
|
||
|
||
#### 示例
|
||
|
||
```js
|
||
bricks.formatTime(3661); // 输出 "01:01:01"
|
||
bricks.formatTime(59); // 输出 "00:00:59"
|
||
```
|
||
|
||
#### 实现说明
|
||
|
||
- 小时 = `Math.floor(seconds / 3600)`
|
||
- 分钟 = `Math.floor((seconds % 3600) / 60)`
|
||
- 秒 = `seconds % 60`
|
||
- 每部分使用 `.padStart(2, '0')` 补齐至两位数字。
|
||
|
||
---
|
||
|
||
## 2. TimePassed 类(正向计时器)
|
||
|
||
用于从 0 开始递增显示已过去的时间(如“00:00:05”表示运行了 5 秒)。
|
||
|
||
### 继承关系
|
||
|
||
```js
|
||
class TimePassed extends bricks.VBox
|
||
```
|
||
|
||
> 继承自 `bricks.VBox`,作为容器可包含子控件。
|
||
|
||
---
|
||
|
||
### 构造函数
|
||
|
||
```js
|
||
new bricks.TimePassed(opts)
|
||
```
|
||
|
||
#### 参数
|
||
|
||
| 参数名 | 类型 | 是否必需 | 描述 |
|
||
|----------|--------|----------|--------------------------|
|
||
| opts | object | 是 | 配置对象 |
|
||
| opts.text_rate | any | 否 | 文本渲染速率或样式参数,传递给内部 Text 组件 |
|
||
|
||
> ⚠️ 注意:当前代码中存在潜在 bug —— 使用了未定义变量 `this.t` 和 `this.text_rate`,应为 `opts.text_rate` 并初始化文本内容为 `formatTime(this.seconds)`。
|
||
|
||
✅ **建议修复后的构造函数片段:**
|
||
|
||
```js
|
||
this.seconds = 0;
|
||
this.text_w = new bricks.Text({
|
||
text: bricks.formatTime(this.seconds),
|
||
rate: opts.text_rate
|
||
});
|
||
this.add_widget(this.text_w);
|
||
```
|
||
|
||
---
|
||
|
||
### 方法
|
||
|
||
| 方法名 | 描述 |
|
||
|------------|--------------------------------------------------------------|
|
||
| `start()` | 启动计时器,每秒调用一次 `add_one_second()`,开始递增时间。 |
|
||
| `stop()` | 停止计时器,取消当前调度任务。 |
|
||
|
||
#### `add_one_second()`
|
||
|
||
私有方法,由 `schedule_once` 调度执行:
|
||
|
||
- 每次使 `this.seconds += 1`
|
||
- 更新显示文本
|
||
- 自动重新调度下一次调用(形成循环)
|
||
|
||
> 使用 `bind(this)` 确保上下文正确。
|
||
|
||
⚠️ 若不停止,将持续运行。
|
||
|
||
---
|
||
|
||
## 3. Countdown 类(倒计时器)
|
||
|
||
实现一个可配置的倒计时组件,在时间归零时触发事件。
|
||
|
||
### 继承关系
|
||
|
||
```js
|
||
class Countdown extends bricks.VBox
|
||
```
|
||
|
||
> 同样继承自 `VBox` 容器组件。
|
||
|
||
---
|
||
|
||
### 配置选项 (`opts`)
|
||
|
||
| 参数名 | 类型 | 是否必需 | 描述 |
|
||
|-------------|--------|----------|----------------------------------------------------------------------|
|
||
| limit_time | string | 是 | 初始倒计时时间,格式支持 `"SS"`、`"MM:SS"` 或 `"HH:MM:SS"` |
|
||
| text_rate | any | 否 | 传入 Text 组件的渲染参数 |
|
||
|
||
---
|
||
|
||
### 事件
|
||
|
||
| 事件名 | 触发条件 | 数据参数 |
|
||
|-----------|----------------------------------|--------|
|
||
| `timeout` | 当倒计时结束(`this.seconds < 1`)时触发 | 无 |
|
||
|
||
可通过 `this.dispatch('timeout')` 触发事件,供外部监听。
|
||
|
||
---
|
||
|
||
### 构造函数
|
||
|
||
```js
|
||
new bricks.Countdown(opts)
|
||
```
|
||
|
||
#### 功能说明
|
||
|
||
1. 解析 `opts.limit_time` 字符串为小时、分钟、秒。
|
||
2. 支持以下格式:
|
||
- `"30"` → 30 秒
|
||
- `"5:30"` → 5 分 30 秒
|
||
- `"1:30:45"` → 1 小时 30 分 45 秒
|
||
3. 转换为总秒数存储在 `this.seconds`。
|
||
4. 创建并添加 `Text` 组件用于显示时间。
|
||
|
||
> ✅ 支持任意长度分割,但仅处理 1~3 段,其余情况默认按三段解析。
|
||
|
||
---
|
||
|
||
### 方法
|
||
|
||
| 方法名 | 描述 |
|
||
|-------------------|----------------------------------------------------------------------|
|
||
| `start()` | 启动倒计时,延迟 1 秒后调用 `time_down_second()` 开始递减。 |
|
||
| `time_down_second()` | 私有方法:每次减少 1 秒,更新显示;若时间为 0,则触发 `timeout` 事件并终止。 |
|
||
|
||
> 使用 `schedule_once(fn, delay)` 实现定时回调,形成递归倒计时。
|
||
|
||
---
|
||
|
||
## 4. 工厂注册
|
||
|
||
为了支持动态创建组件实例,通过工厂模式注册两个类:
|
||
|
||
```js
|
||
bricks.Factory.register('Countdown', bricks.Countdown);
|
||
bricks.Factory.register('TimePassed', bricks.TimePassed);
|
||
```
|
||
|
||
### 用途
|
||
|
||
允许通过字符串名称动态创建组件,例如:
|
||
|
||
```js
|
||
let timer = bricks.Factory.create('TimePassed', { text_rate: 'high' });
|
||
let cd = bricks.Factory.create('Countdown', { limit_time: '00:01:00' });
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 使用示例
|
||
|
||
### 示例 1:创建并启动正向计时器
|
||
|
||
```js
|
||
let timePassed = new bricks.TimePassed({
|
||
text_rate: 'normal'
|
||
});
|
||
|
||
// 添加到页面或其他容器
|
||
someContainer.add_widget(timePassed);
|
||
|
||
// 开始计时
|
||
timePassed.start();
|
||
|
||
// 停止计时
|
||
// timePassed.stop();
|
||
```
|
||
|
||
### 示例 2:创建倒计时器并监听超时事件
|
||
|
||
```js
|
||
let countdown = new bricks.Countdown({
|
||
limit_time: '00:00:10', // 10 秒倒计时
|
||
text_rate: 'large'
|
||
});
|
||
|
||
countdown.on('timeout', function() {
|
||
console.log('倒计时结束!');
|
||
alert('时间到!');
|
||
});
|
||
|
||
someContainer.add_widget(countdown);
|
||
countdown.start(); // 启动倒计时
|
||
```
|
||
|
||
### 示例 3:使用工厂创建组件
|
||
|
||
```js
|
||
let widget = bricks.Factory.create('Countdown', {
|
||
limit_time: '01:30:00'
|
||
});
|
||
|
||
widget.on('timeout', () => {
|
||
console.log('倒计时完成');
|
||
});
|
||
|
||
container.add_widget(widget);
|
||
widget.start();
|
||
```
|
||
|
||
---
|
||
|
||
## 注意事项与改进建议
|
||
|
||
1. **Bug 修复建议**
|
||
- 在 `TimePassed` 构造函数中,`text: this.t` 应改为 `text: bricks.formatTime(this.seconds)`
|
||
- `rate: this.text_rate` 应为 `rate: opts.text_rate`
|
||
|
||
2. **性能优化**
|
||
- 可考虑使用 `setInterval` 替代递归 `schedule_once`,但当前方式更灵活且兼容异步调度系统。
|
||
|
||
3. **扩展性建议**
|
||
- 可增加 `pause()` 方法支持暂停/恢复。
|
||
- 提供 `getFormattedTime()` 公共方法获取当前时间字符串。
|
||
|
||
4. **输入验证**
|
||
- 对 `limit_time` 的解析可加入非法值检测(如非数字)。
|
||
|
||
---
|
||
|
||
## 版本信息
|
||
|
||
- 模块名:`bricks.time`
|
||
- 作者:Bricks Framework Team
|
||
- 最后更新:2025-04-05
|
||
|
||
---
|
||
|
||
📌 *本文档适用于 Bricks UI 框架 v1.x+* |