news 2026/6/15 8:01:26

ArkTS-EventHub使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ArkTS-EventHub使用

轻量级的本地事件发布/订阅(Pub/Sub)机制,用于同一个 Ability 内不同页面或组件之间的通信,实现解耦的组件间通信

eventHubAbility 内部私有的,不能跨 Ability 通信(如从一个 EntryAbility 发消息到另一个 ServiceAbility)。

使用:

1:在 Ability 中获取 eventHub(你的代码)
// EntryAbility.ts export default class EntryAbility extends UIAbility { onCreate() { // 获取 eventHub(通常保存为成员变量) this.eventHub = this.context.eventHub; } }

this.context.eventHub只能在UIAbility的生命周期方法中访问(如onCreate,onWindowStageCreate)。

2:在页面中使用(需通过 AppStorage 或其他方式传递)

由于 ArkTS 页面组件(@Component)无法直接访问Abilitycontext,通常需要将eventHub存入全局状态:

在 Ability 中存入 AppStorage:

// EntryAbility.ts import { AppStorage } from '@kit.ArkUI'; export default class EntryAbility extends UIAbility { onWindowStageCreate(windowStage: window.WindowStage) { // 将 eventHub 存入全局(注意:仅存引用,不序列化) AppStorage.setOrCreate('eventHub', this.context.eventHub); windowStage.loadContent('pages/Index'); } }

在页面中使用:

// Index.ets import { AppStorage } from '@kit.ArkUI'; @Entry @Component struct Index { build() { Column() { Button('发送事件') .onClick(() => { const hub = AppStorage.get<EventHub>('eventHub'); // 发布事件 hub.emit('userLogin', { userId: '123', name: 'Alice' }); }) } } }

在另一个页面监听:

// Profile.ets @Entry @Component struct Profile { aboutToAppear() { const hub = AppStorage.get<EventHub>('eventHub'); // 订阅事件 hub.on('userLogin', (data) => { console.log('收到登录事件:', data); // 更新 UI }); } aboutToDisappear() { // 务必取消订阅,避免内存泄漏! const hub = AppStorage.get<EventHub>('eventHub'); hub.off('userLogin'); } }

方法

说明

emit(event: string, ...args: any[])

发布事件(可传参数)

on(event: string, callback: Function)

订阅事件

off(event: string, callback?: Function)

取消订阅(建议在aboutToDisappear中调用)

once(event: string, callback: Function)

订阅一次(触发后自动取消)

3:注意事项

1.不能跨 Ability 使用

  • eventHub仅限同一个 UIAbility 内部通信。

  • 跨 Ability 请使用Want / AbilityStage / 全局状态管理(如 AppStorage + 状态变量)

2.必须手动取消订阅

  • 否则会导致内存泄漏(回调函数持有页面引用,阻止 GC)。

  • 推荐在aboutToDisappear()中调用off()

3.不适合复杂状态管理

  • 对于全局状态(如用户信息、主题),建议使用:

    • @StorageLink+AppStorage

    • 自定义状态管理库(如类似 Redux 的方案)

4:替代方案对比
方案适用场景优点缺点
eventHub同 Ability 内简单通知轻量、官方支持不能跨 Ability,需手动管理订阅
AppStorage+@StorageLink全局状态共享响应式更新,自动同步仅支持简单数据类型
自定义 Callback父子组件通信简单直接需 props 逐层传递
UIContext封装统一事件管理可扩展非官方,增加复杂度
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 17:01:56

如何快速掌握SAE J1939协议:重型车辆通信的终极指南

如何快速掌握SAE J1939协议&#xff1a;重型车辆通信的终极指南 【免费下载链接】SAEJ1939协议文档库完整版双语对照 SAE J1939协议文档库&#xff08;完整版&#xff0c;双语对照&#xff09;欢迎来到SAE J1939协议的综合资源库&#xff01;本仓库致力于为汽车电子、车联网领域…

作者头像 李华
网站建设 2026/6/14 6:25:48

Digital Manga Archiver:漫画数字备份终极指南

在数字时代&#xff0c;保护您珍贵的漫画收藏变得前所未有的重要。Comic Backup漫画备份工具是一款专为漫画爱好者设计的开源浏览器扩展&#xff0c;能够将您在在线平台购买的漫画安全备份为标准CBZ格式&#xff0c;实现真正的离线阅读和永久保存。 【免费下载链接】comic-back…

作者头像 李华
网站建设 2026/6/11 22:56:38

服务器解决挖矿程序占用cpu100%问题

发现正式服务器 kdevtmpfsi 进程CPU100%大致是这样的&#xff0c;kdevtmpfsi 的CPU占满&#xff0c;ps -aux | grep kinsingps -aux | grep kdevtmpfsi可以找到对应的PIDkill -9 PID 2个都得杀find / -name kdevtmpfsifind / -name kinsing发现是来自于挂载容器目录的文件夹(ba…

作者头像 李华
网站建设 2026/6/14 1:10:41

构建智能学术工作流:这5款工具让文献阅读与论文写作无缝衔接!

作为一名经历过完整科研周期的博士&#xff0c;我深切体会过被文献海洋淹没的焦虑和论文写作的煎熬。据统计&#xff0c;科研人员平均每年花费在文献检索与阅读上的时间超过 500小时&#xff0c;而论文写作过程中的反复修改与格式调整更是吞噬了大量宝贵的研究时间。幸运的是&a…

作者头像 李华
网站建设 2026/6/12 9:57:46

[特殊字符] 熊猫之力:从零开始解锁pandas的强大能力

&#x1f3af; 为什么学习Pandas&#xff1f; 在数据科学的世界里&#xff0c;80%的时间都花在数据清洗和预处理上。Pandas作为Python数据分析的核心库&#xff0c;就像数据分析师的“瑞士军刀”&#xff0c;能帮你高效处理结构化数据&#xff0c;让数据从原始状态变成有价值的…

作者头像 李华
网站建设 2026/6/13 23:45:32

iOS设备调试兼容性终极解决方案:iOSDeviceSupport项目完整指南

iOS设备调试兼容性终极解决方案&#xff1a;iOSDeviceSupport项目完整指南 【免费下载链接】iOSDeviceSupport All versions of iOS Device Support 项目地址: https://gitcode.com/gh_mirrors/ios/iOSDeviceSupport 你是否曾遇到过这样的困境&#xff1a;iPhone已经升级…

作者头像 李华