文章配图: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 状态同步

四、最佳实践

  1. 事件命名规范playMergestateChanged 动词+名词
  2. 订阅在初始化aboutToAppear 时订阅
  3. 取消订阅hub.off('eventName') 防内存泄漏
  4. 不传递复杂对象:只传递必要的数据参数

五、事件列表

事件名 数据 触发时机
playMerge 合并时
playLevelUp 等级 升级时
playGameOver 得分 结束时
scoreChanged 得分 得分变化
stateChanged 状态 状态切换

总结

EventHub 实现跨模块的松耦合事件通信,适合音效播放等全局通知。核心要点:hub.on() 订阅、 hub.emit() 发布、 注意取消订阅防泄漏

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐