news 2026/10/25 19:55:32

ArkTS-EventHub使用

作者头像

张小明

前端开发工程师

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

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

eventHub是Ability 内部私有的,不能跨 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)无法直接访问Ability的context,通常需要将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/10/25 6:57:36

3.6万专业观众+50+采购团 CES Asia2026破解创新产品市场对接难题

创新产品“叫好不叫座”的核心痛点&#xff0c;在于优质技术与精准市场需求的脱节。定于2026年6月10日至12日在北京举办的CES Asia 2026&#xff08;亚洲消费电子展&#xff09;&#xff0c;以“精准匹配权益倾斜资源聚合”的三维解决方案&#xff0c;为获奖企业铺设直达全球市…

作者头像 李华
网站建设 2026/10/25 11:08:10

B站漫画下载终极指南:一键搞定海量漫画本地化管理

还在为喜欢的漫画突然下架而烦恼&#xff1f;担心网络不好时无法畅快阅读&#xff1f;今天给大家介绍一款实用工具——BiliBili-Manga-Downloader&#xff01;这款图形界面工具不仅支持二维码登录、关键词搜索&#xff0c;还能下载未解锁章节&#xff0c;多线程批量下载效率超高…

作者头像 李华
网站建设 2026/10/25 14:24:07

基于SpringBoot+vue的华强北商城二手手机管理系统

1. 演示地址 后台&#xff1a;http://huaqiangbeiershoushojiushangcheng.xiaobias.com/huaqiangbeiershoushojiushangcheng/admin/dist/index.html 前台&#xff1a;http://huaqiangbeiershoushojiushangcheng.xiaobias.com/huaqiangbeiershoushojiushangcheng/front/index.ht…

作者头像 李华
网站建设 2026/10/26 5:48:23

20、音频插件与视频播放的技术实现

音频插件与视频播放的技术实现 1. LADSPA 音频插件 1.1 amp 程序概述 amp 程序是一个重要的 LADSPA 插件示例,位于 LADSPA 源代码的 ladspa_sdk/src/plugins/amp.c 文件中。若想编写 LADSPA 插件或了解其原理,分析该程序很有必要。它包含几个关键函数,以下为你详细说明…

作者头像 李华
网站建设 2026/10/26 6:28:03

贝锐携手中兴!星云MAX内置蒲公英异地组网,路由器变身私有云枢纽

近日&#xff0c;国产远程连接SaaS服务创领者贝锐与中兴通讯达成深度合作。贝锐旗下蒲公英异地组网&#xff0c;现已正式入驻中兴新品星云MAX有线路由器的内置插件中心。此次合作赋予了中兴路由强大的远程连接能力&#xff0c;为用户打造无需公网IP即可远程访问的私有云中心。中…

作者头像 李华
网站建设 2026/10/25 20:05:56

虚拟机性能优化实战指南

虚拟机性能优化实战技术文章大纲虚拟机性能优化概述虚拟机性能优化的重要性常见性能瓶颈与挑战性能优化的基本原则硬件资源配置优化CPU分配策略&#xff08;如vCPU与物理核心的合理分配&#xff09;内存分配与动态内存管理技术磁盘I/O优化&#xff08;SSD、缓存策略、RAID配置&…

作者头像 李华