鸿蒙开发EventBus

鸿蒙开发EventBus

鸿蒙没有EventBus这个库,有emitter这个通知库。

一、吐槽:虽然emitter能做EventBus功能,但是它存在的坑,真的用了才知道,能不用它就不用吧

坑的点:

  1. 一个注销,其他地方用到了这个id都会被注销掉
  2. 如果不注销,多次进这个page,会重复注册,这个通知里面执行的东西就会多次执行
  3. 基于第2点,如果你打开多个同个page,它等同于多次注册,那你每个page的通知就会执行多次。这是灾难级的
  4. 如果不注销,就算你的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 = false
    if (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 = true
          break
        }
      }
    }

    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)
      })
    }
  }

需要完整处理代码的可私信我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值