HarmonyOS鸿蒙Next中如何使用emitter实现事件总线进行组件间通信?
HarmonyOS鸿蒙Next中如何使用emitter实现事件总线进行组件间通信? 我需要在不同页面或组件之间传递事件和数据,如何使用emitter实现事件总线?
3 回复
实现思路:
- 导入emitter模块:
import { emitter } from '@kit.BasicServicesKit';
- 定义事件ID并发送事件:
const EVENT_REFRESH = { eventId: 1001 };
emitter.emit(EVENT_REFRESH, { data: { message: 'refresh' } });
- 订阅事件并处理:
emitter.on(EVENT_REFRESH, (data) => {
console.info(`Received: ${JSON.stringify(data)}`);
});
- 完整示例代码:
import { emitter } from '@kit.BasicServicesKit';
const EventIds = {
USER_LOGIN: { eventId: 1001 },
DATA_REFRESH: { eventId: 1002 }
};
class EventBus {
static emit(eventId: emitter.InnerEvent, data?: Object): void {
emitter.emit(eventId, { data: data });
}
static on(eventId: emitter.InnerEvent, callback: (data: emitter.EventData) => void): void {
emitter.on(eventId, callback);
}
static off(eventId: number): void {
emitter.off(eventId);
}
}
@Entry
@Component
struct EventBusDemo {
@State message: string = '';
aboutToAppear() {
EventBus.on(EventIds.DATA_REFRESH, (eventData: emitter.EventData) => {
const data = eventData.data as Record<string, number>;
this.message = `数据已刷新: ${data?.timestamp}`;
});
}
aboutToDisappear() {
EventBus.off(EventIds.DATA_REFRESH.eventId);
}
build() {
Column({ space: 16 }) {
Text(this.message || '等待事件...').fontSize(14)
Button('发送刷新事件')
.onClick(() => {
EventBus.emit(EventIds.DATA_REFRESH, { timestamp: Date.now() });
})
}
.padding(20)
}
}
更多关于HarmonyOS鸿蒙Next中如何使用emitter实现事件总线进行组件间通信?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,使用emitter实现事件总线进行组件间通信,首先导入@ohos.events.emitter模块。通过emitter.on()订阅事件,emitter.off()取消订阅,emitter.emit()发送事件。事件以键值对形式传递,支持同步和异步模式。需注意事件命名唯一性,避免内存泄漏。
在HarmonyOS Next中,可以使用emitter模块实现事件总线,进行跨组件、跨页面的通信。以下是具体使用方法:
1. 导入模块
import emitter from '@ohos.events.emitter';
2. 定义事件
// 定义事件ID(建议使用字符串常量)
const EVENT_ID = 'my_custom_event';
3. 发送事件
// 创建事件数据
let eventData: emitter.EventData = {
data: {
message: 'Hello from sender',
value: 123
}
};
// 发送事件
emitter.emit({
eventId: EVENT_ID,
priority: emitter.EventPriority.HIGH // 可选优先级
}, eventData);
4. 接收事件
// 创建订阅者
let subscriber: emitter.EventReceiver;
// 订阅事件
subscriber = emitter.on(EVENT_ID, (eventData: emitter.EventData) => {
console.log('收到事件:', eventData.data);
// 处理接收到的数据
});
// 取消订阅(在组件销毁时调用)
emitter.off(EVENT_ID, subscriber);
5. 一次性事件
// 只接收一次事件
emitter.once(EVENT_ID, (eventData) => {
console.log('一次性事件:', eventData.data);
});
实际应用示例:
// PageA.ts - 发送事件
import emitter from '@ohos.events.emitter';
const UPDATE_LIST_EVENT = 'update_list';
function sendUpdateEvent() {
emitter.emit({
eventId: UPDATE_LIST_EVENT
}, {
data: { refresh: true }
});
}
// PageB.ts - 接收事件
import emitter from '@ohos.events.emitter';
let receiver: emitter.EventReceiver;
aboutToAppear() {
receiver = emitter.on(UPDATE_LIST_EVENT, (eventData) => {
// 刷新列表数据
this.refreshList();
});
}
aboutToDisappear() {
emitter.off(UPDATE_LIST_EVENT, receiver);
}
注意事项:
- 事件ID建议使用有意义的字符串常量
- 及时取消订阅,避免内存泄漏
- 事件数据支持基本类型和对象
- 可以在UIAbility、Page、Component等任何地方使用
这种方式解耦了组件间的直接依赖,适合状态更新、数据同步等场景。

