HarmonyOS应用开发实战:猫猫大作战-EventHub 事件总线
·


前言
EventHub 是 HarmonyOS 的事件总线机制,用于组件或模块之间的松耦合通信。在「猫猫大作战」中,EventHub 用于音效播放、得分变更、游戏状态切换等跨组件通知。
一、EventHub 基础
import { EventHub } from '@kit.ArkUI';
// 创建 EventHub
const eventHub = new EventHub();
// 订阅事件
eventHub.on('scoreChanged', (score: number) => {
console.info(`得分更新: ${score}`);
// 更新 UI 等
});
// 发布事件
eventHub.emit('scoreChanged', 2450);
二、游戏中的应用
// 音效管理模块 — 订阅事件
class SFXService {
constructor(hub: EventHub) {
hub.on('playMerge', () => this.play('merge'));
hub.on('playLevelUp', () => this.play('level_up'));
hub.on('playGameOver', () => this.play('game_over'));
hub.on('playButton', () => this.play('button'));
}
private play(name: string): void {
console.info(`播放音效: ${name}`);
}
}
// 游戏引擎 — 发布事件
class GameEngine {
private hub: EventHub;
constructor(hub: EventHub) {
this.hub = hub;
}
onMerge(): void {
this.hub.emit('playMerge');
}
onGameOver(): void {
this.hub.emit('playGameOver');
}
}
三、EventHub vs @State
| 特性 | EventHub | @State |
|---|---|---|
| 通信范围 | 任意模块 | 组件树 |
| 耦合度 | 低(松耦合) | 中(父子依赖) |
| 数据流 | 单向事件 | 双向绑定 |
| 调试 | 较难追踪 | 易追踪 |
| 适用场景 | 跨模块通知 | UI 状态同步 |
四、最佳实践
- 事件命名规范:
playMerge、stateChanged动词+名词 - 订阅在初始化:
aboutToAppear时订阅 - 取消订阅:
hub.off('eventName')防内存泄漏 - 不传递复杂对象:只传递必要的数据参数
五、事件列表
| 事件名 | 数据 | 触发时机 |
|---|---|---|
playMerge |
无 | 合并时 |
playLevelUp |
等级 | 升级时 |
playGameOver |
得分 | 结束时 |
scoreChanged |
得分 | 得分变化 |
stateChanged |
状态 | 状态切换 |
总结
EventHub 实现跨模块的松耦合事件通信,适合音效播放等全局通知。核心要点:hub.on() 订阅、 hub.emit() 发布、 注意取消订阅防泄漏。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
更多推荐


所有评论(0)