鸿蒙开发>鸿蒙开发EventBus
鸿蒙没有EventBus这个库,有emitter这个通知库。
emitterEventBus_2">一、吐槽:虽然emitter能做EventBus功能,但是它存在的坑,真的用了才知道,能不用它就不用吧
坑的点:
- 一个注销,其他地方用到了这个id都会被注销掉
- 如果不注销,多次进这个page,会重复注册,这个通知里面执行的东西就会多次执行
- 基于第2点,如果你打开多个同个page,它等同于多次注册,那你每个page的通知就会执行多次。这是灾难级的
- 如果不注销,就算你的page关闭,它还是会执行的
它的用法我就不说了,自己去官网看看
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-emitter-V5#emitteron
二、 针对它的坑的解决方案
其实最好的是它和EventBus一样,和page绑定最好的。page之间不要互相影响
解决方案:
同一事件定一组集合出来,相同事件,通知集合中的所有注册了的事件
部分代码:
定义一个事件
static HomeFilterEvents:emitter.InnerEvent[] = []
static readonly HOME_FILTER_EVENT : emitter.InnerEvent = {eventId:10001}
往集合里面添加
static registerEvent(events:emitter.InnerEvent[],typeEventId:number,eventId:number,callback?: (event:emitter.EventData)=>void){let isExist = falseif (events && events.length > 0) {for (let i = events.length-1;i>= 0;i--){if (events[i].eventId - typeEventId === eventId) {// 先注销一次,再注册emitter.off(typeEventId+eventId)emitter.on({eventId: typeEventId+eventId}, (event) => { callback?.(event) })isExist = truebreak}}}if (!isExist){events.push({eventId: typeEventId+eventId})emitter.on({eventId: typeEventId+eventId}, (event) => { callback?.(event) })}}
发送事件
/*** @desc : 发送通知,同一类型也就同一个通知,全部发送* @author : congge on 2024-09-11 10:49**/static postEvent(events:emitter.InnerEvent[],data?: emitter.EventData){if (events && events.length > 0){events.forEach((value)=>{emitter.emit(value,data)})}}
需要完整处理代码的可私信我