通知调度器
调度器 (Dispatcher) 是 TechUI 消息通知系统的核心“交通指挥官”。在触发任意通知的时候它会被调用,它接管了 Message、Notification、Toast 和 Flash 四种通知类型的流量分发。
调度器的主要职责是维护通知队列、计算堆叠位置、处理优先级冲突(如 Flash 插队),并防止短时间内触发大量通知导致界面渲染混乱。
核心调度逻辑
调度器将通知分为三个维度的通道进行管理:
并行通道 (Parallel)
适用组件: Message, Notification
- 机制: 允许同时存在多个实例。
- 布局: 调度器会根据实例的高度和预设的
offset(间距),自动计算每个实例的垂直坐标,形成整齐的堆叠效果。 - 分组: 当检测到连续触发的通知具有相同的内容和类型时,调度器会将其合并,仅更新计数器,不再新增 DOM 节点。
串行通道 (Serial / Queue)
适用组件: Toast
- 机制: 严格的单实例排队机制。
- 逻辑: 屏幕上同一时间只能显示一个 Toast。后续触发的 Toast 会进入内存队列等待。只有当前一个 Toast 销毁(倒计时结束)后,调度器才会从队列中取出下一个并渲染。
强占通道 (Preemptive / Flash)
适用组件: Flash
- 机制: 最高优先级的独占模式。
- 逻辑:
- 当 Flash 触发时,调度器会立即暂停当前的 Toast 队列。
- Flash 优先展示(伴随全屏视觉效果)。
- Flash 队列清空(手动关闭或结束)后,调度器才会恢复 Toast 队列的执行。
- 特性: 类似于“警车开道”,Flash 拥有绝对的路权。
运行时状态
TechUI 通过 $aDispatcher 对象暴露了调度器的实时运行状态。这通常用于调试或开发自定义的状态监控面板。
javascript
import { inject } from 'vue';
const { $aDispatcher } = inject('$global');
// 访问当前状态
console.log($aDispatcher.queue.length);只读属性
| 属性名 | 类型 | 说明 |
|---|---|---|
| currentChannel | String | 当前正在活跃的通道名称。可能的值:null (空闲), 'parallel', 'serial', 'flash'。 |
| queue | Array | 当前等待展示的消息队列。包含了所有尚未渲染的 Toast 或 Flash 实例配置。 |
全局配置
调度器的行为配置位于 $attentionConfig.dispatcher 中。这些配置是响应式的,修改后会立即影响后续的通知行为。
javascript
import { inject } from 'vue';
const { $attentionConfig } = inject('$global');
// 修改堆叠间距
$attentionConfig.value.dispatcher.offset = 50;配置项
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| visible | Boolean | true | 是否启用调度器。设为 false 将阻止所有通知显示。 |
| debug | Boolean | false | 是否开启内置的可视化调试面板(在屏幕右下角显示队列信息)。 |
| offset | Number | 40 | 并行通道(Message/Notify)堆叠时的垂直间距 (px)。 |
| position | String | 'bottom-right' | 调试面板在屏幕上的位置。 |
内部 API
虽然开发者通常直接调用 $tMessage 等具体方法,但了解底层 API 有助于理解其工作原理。
$tAttentionDispatcher(options)
这是所有通知组件的底层入口。当您调用 $tMessage 时,实际上是将参数标准化后传递给了此方法。
- 功能: 将通知请求推入调度管道。
- 参数: 接收包含组件类型、内容、优先级等信息的配置对象。
$tAttentionDispatcherClose()
- 功能: 强制清空调度器中的所有队列,并销毁当前所有显示的通知实例。
- 场景: 通常在路由切换或用户注销时调用,以确保界面干净。