Skip to content

通知调度器

👑首创

调度器 (Dispatcher) 是 TechUI 消息通知系统的核心“交通指挥官”。在触发任意通知的时候它会被调用,它接管了 Message、Notification、Toast 和 Flash 四种通知类型的流量分发。

调度器的主要职责是维护通知队列、计算堆叠位置、处理优先级冲突(如 Flash 插队),并防止短时间内触发大量通知导致界面渲染混乱。

核心调度逻辑

调度器将通知分为三个维度的通道进行管理:

并行通道 (Parallel)

适用组件: Message, Notification

  • 机制: 允许同时存在多个实例。
  • 布局: 调度器会根据实例的高度和预设的 offset(间距),自动计算每个实例的垂直坐标,形成整齐的堆叠效果。
  • 分组: 当检测到连续触发的通知具有相同的内容和类型时,调度器会将其合并,仅更新计数器,不再新增 DOM 节点。

串行通道 (Serial / Queue)

适用组件: Toast

  • 机制: 严格的单实例排队机制。
  • 逻辑: 屏幕上同一时间只能显示一个 Toast。后续触发的 Toast 会进入内存队列等待。只有当前一个 Toast 销毁(倒计时结束)后,调度器才会从队列中取出下一个并渲染。

强占通道 (Preemptive / Flash)

适用组件: Flash

  • 机制: 最高优先级的独占模式。
  • 逻辑:
    1. 当 Flash 触发时,调度器会立即暂停当前的 Toast 队列。
    2. Flash 优先展示(伴随全屏视觉效果)。
    3. Flash 队列清空(手动关闭或结束)后,调度器才会恢复 Toast 队列的执行。
  • 特性: 类似于“警车开道”,Flash 拥有绝对的路权。

运行时状态

TechUI 通过 $aDispatcher 对象暴露了调度器的实时运行状态。这通常用于调试或开发自定义的状态监控面板。

javascript
import { inject } from 'vue';
const { $aDispatcher } = inject('$global');

// 访问当前状态
console.log($aDispatcher.queue.length);

只读属性

属性名类型说明
currentChannelString当前正在活跃的通道名称。可能的值:null (空闲), 'parallel', 'serial', 'flash'
queueArray当前等待展示的消息队列。包含了所有尚未渲染的 Toast 或 Flash 实例配置。

全局配置

调度器的行为配置位于 $attentionConfig.dispatcher 中。这些配置是响应式的,修改后会立即影响后续的通知行为。

javascript
import { inject } from 'vue';
const { $attentionConfig } = inject('$global');

// 修改堆叠间距
$attentionConfig.value.dispatcher.offset = 50;

配置项

属性名类型默认值说明
visibleBooleantrue是否启用调度器。设为 false 将阻止所有通知显示。
debugBooleanfalse是否开启内置的可视化调试面板(在屏幕右下角显示队列信息)。
offsetNumber40并行通道(Message/Notify)堆叠时的垂直间距 (px)。
positionString'bottom-right'调试面板在屏幕上的位置。

内部 API

虽然开发者通常直接调用 $tMessage 等具体方法,但了解底层 API 有助于理解其工作原理。

$tAttentionDispatcher(options)

这是所有通知组件的底层入口。当您调用 $tMessage 时,实际上是将参数标准化后传递给了此方法。

  • 功能: 将通知请求推入调度管道。
  • 参数: 接收包含组件类型、内容、优先级等信息的配置对象。

$tAttentionDispatcherClose()

  • 功能: 强制清空调度器中的所有队列,并销毁当前所有显示的通知实例。
  • 场景: 通常在路由切换或用户注销时调用,以确保界面干净。