HarmonyOS鸿蒙Next中事件订阅EventHub有什么特点,如何使用?
HarmonyOS鸿蒙Next中事件订阅EventHub有什么特点,如何使用? 有这样一个案例,页面A跳转到了页面B,页面B又跳转了页面C,在页面C中需要把数据回调至页面A,我们该如何去做?又或者,在一个模块中需要调用另一个模块中的方法,又该如何调用?在很多的场景下,我们都会想到回调的方式,如果层级较多呢?逐级回调能够解决,但是是十分的麻烦,为了解决这个问题,在鸿蒙当中提供了一个类似于EventBus的能力,它就是EventHub,我们来看一下它的具体使用方式。
一句话解读:EventHub是鸿蒙开发中用于线程内通信的事件中心模块,提供了订阅、触发和取消订阅事件的能力。
主要的特点有三个,第一个就是事件中心,基于发布订阅模式,允许通过事件名进行通信,第二个就是仅支持同一线程内的事件传递,不适用于跨进程或虚拟机间的通信,第三个是单例模式,每个AbilityContext实例拥有独立的EventHub,事件操作仅作用于当前上下文
简单案例
@Entry
@Component
struct DemoPage {
aboutToAppear(): void {
getContext().eventHub.on("test", (data: string) => {
//订阅指定事件
console.log("====" + data)
})
}
build() {
Column() {
Button("点击")
.onClick(() => {
//触发指定事件
getContext().eventHub.emit("test", "hello")
})
}
}
}
以上的代码,点击按钮之后,就是触发一个test事件,并发送一个hello字符串,在aboutToAppear声明周期中,订阅了test事件,就会接收到发送的消息。

EventHub方法介绍
查看源码,EventHub中共有三个方法,分别是on,off和emit方法,源码如下:
on(event: string, callback: Function): void;
off(event: string, callback?: Function): void;
emit(event: string, ...args: Object[]): void;
on方法
主要用于订阅指定事件。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| event | string | 是 | 事件名称。 |
| callback | Function | 是 | 事件回调,事件触发后调用。 |
off方法
主要用于取消订阅指定事件,如果传入callback,代表着取消指定的callback对指定事件的订阅,当该事件触发后,将不会回调该callback;如果不传callback,代表着取消所有callback对指定事件的订阅。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| event | string | 是 | 事件名称。 |
| callback | Function | 否 | 事件回调。如果不传callback,则取消订阅该事件下所有callback。 |
emit方法
用于触发指定事件。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| event | string | 是 | 事件名称。 |
| …args | Object[] | 否 | 可变参数,事件触发时,传递给回调函数的参数。 |
组件之间数据传递
本身EventHub就三个方法,使用起来也是非常的简单,可以适用于页面或者组件之间的数据传递,或者状态回传,下面就简单的以组件之间的数据传递为案例,简单的演示一下。
@Entry
@Component
struct DemoPage {
@State message: string = ""
aboutToAppear(): void {
getContext().eventHub.on("callBack", (data: string) => {
//订阅事件,接收消息
this.message = data
})
}
aboutToDisappear(): void {
//取消订阅
getContext().eventHub.off("callBack")
}
build() {
Column() {
Text(this.message)
TestView()
}.width("100%")
.height("100%")
.justifyContent(FlexAlign.Center)
}
}
@Component
struct TestView {
@State num: number = 0
build() {
Button("传递数据")
.onClick(() => {
this.num++
getContext().eventHub.emit("callBack", "传递一个数据:" + this.num)
})
}
}
如果你只是想发送一个通知,可以不带参数。
相关总结
EventHub主要提供了轻量级的线程内通信机制,适用于组件间数据同步、状态通知等场景,在实际的开发中,一定要注意两个事项,其一就是,注意off取消订阅的使用,可以避免内存泄漏,其二就是,关于事件命名的规范,建议使用常量定义事件名,避免硬编码错误。
更多关于HarmonyOS鸿蒙Next中事件订阅EventHub有什么特点,如何使用?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
EventHub
HarmonyOS Next的EventHub是事件发布订阅中心,支持跨线程、跨进程通信。其特点包括:松耦合设计,发布者与订阅者无需直接引用;支持同步/异步事件处理;提供线程安全的事件管理。
使用步骤
- 创建订阅者回调函数。
- 调用
EventHub.subscribe()注册事件及回调。 - 通过
EventHub.emit()发布事件并传递数据。 - 使用
EventHub.unsubscribe()取消订阅。
事件按类型字符串匹配,支持一次性订阅和粘性事件。
在HarmonyOS Next中,EventHub是一个基于发布/订阅模式的事件中心,主要用于解决跨组件、跨页面的通信问题,尤其适用于你提到的多级页面回调或模块间解耦的场景。
主要特点:
- 松耦合:发布者和订阅者无需直接引用对方,通过事件名进行通信,降低了模块间的依赖。
- 灵活订阅:支持订阅、取消订阅特定事件,管理事件监听的生命周期。
- 线程安全:内部处理了线程同步,可在不同线程中安全使用。
- 轻量高效:作为ArkTS运行时内置能力,开销小,性能高。
基本使用方式:
-
获取EventHub实例: 通常通过UI组件的上下文获取。
import { UIContext } from '@kit.ArkUI'; // 在UI组件中 private context = getContext(this) as UIContext; private eventHub = this.context.getEventHub(); -
订阅事件: 在需要接收数据的页面(如页面A)订阅事件。
// 页面A中 this.eventHub.on('event_name', (data: YourDataType) => { // 处理接收到的数据 console.log('Received data:', data); }); -
发布事件: 在发送数据的页面(如页面C)发布事件。
// 页面C中 this.eventHub.emit('event_name', yourData); -
取消订阅: 在组件生命周期结束时(如
aboutToDisappear)取消订阅,避免内存泄漏。// 页面A中 aboutToDisappear() { this.eventHub.off('event_name'); }
针对你的案例:
页面C可以直接通过eventHub.emit发布事件,页面A在初始化时订阅该事件。这样无需经过页面B中转,实现了页面C到页面A的直接数据回调。
注意事项:
- 事件名建议使用常量管理,避免拼写错误。
- 确保订阅和发布使用相同的EventHub实例(同一UI上下文)。
- 及时取消订阅,防止不必要的回调或内存问题。
EventHub提供了一种简洁的方式处理跨层级通信,能有效替代复杂的逐级回调。

