全局静态类事件总线通过单例管理跨页面事件,支持泛型、页面ID隔离、自动清理与跨Ability通信,比window方案更适配HarmonyOS。

用全局静态类实现跨页面自定义事件分发,核心是创建一个单例对象统一管理事件注册、派发与清理,避免依赖框架、不侵入页面生命周期,同时保证类型安全和内存可控。
定义静态事件总线类
在 ArkTS 或 TypeScript 环境中,声明一个带私有构造器的类,通过静态方法暴露唯一实例。关键点包括:事件存储用 Map 或数组按 eventName 分组;每个监听项需绑定唯一标识(如页面 ID),防止卸载时误删其他页面监听器。
- 使用 this.getUniqueId() 获取当前页面组件唯一 ID(鸿蒙推荐方式)作为 eventId
- 事件数据封装为 ESObject 或标准 JSON 可序列化对象,便于跨 Ability 传递
- 支持泛型方法,使 register
和 emit 具备类型提示
注册与反注册必须成对出现
页面 onWillAppear 时调用 register,onWillDisappear 或 onDestroy 时务必调用 unregister,并传入相同 eventName 和 eventId。若遗漏反注册,会导致重复响应或内存泄漏——尤其在 TabContent 切换或页面栈反复压入弹出时。
- register 方法内部检查同名事件是否已存在,避免重复添加同一页面监听器
- unregister 采用 filter + 赋值方式清空匹配项,不直接 splice 避免索引错位
- 建议在页面级 useEffect / onWillAppear 中封装注册逻辑,提升复用性
触发事件并确保跨页面可达
调用 emit 方法时,遍历对应 eventName 的所有监听项,逐个执行回调。注意:ArkTS 中 event 回调默认运行在主线程,无需额外线程同步;但若涉及耗时操作(如更新 localstorage 或发起网络请求),应主动移至 taskpool 处理。
- emit 数据建议扁平化,避免深层嵌套对象导致序列化失败
- 如需跨 Ability(如从 PageAbility 向 ServiceExtensionAbility 发送通知),需配合 @ohos.app.ability.common 提供的跨进程通信能力补充
- 可扩展支持 once 方法,实现“只响应一次”的事件语义
与 window 自定义事件的区别
全局静态类比 window.dispatchEvent 更适合 HarmonyOS 应用:它不依赖 DOM 环境,兼容纯 ArkTS 模块;支持页面级隔离(靠 eventId),避免全局污染;可集成日志追踪、错误降级等增强能力。而 window 方案在非浏览器环境(如 ServiceExtensionAbility)不可用,且缺乏页面维度控制。
不复杂但容易忽略细节。










