JS中的时间总线EventBus

今天来梳理一下组件间通讯之一的事件总线,在项目中也是高频出现的一个设计模式

总的来说有两个角色,一个是消息的发布者(一个),一个是消息的接收者(多个)

知道总体的一个关系,那么我们就可以实现一个自己的EventBus

1.创建一个类并创建一个事件池
class EventBus {
  private events: {
    [key: string]: Array<{fn: Function, isOnce: boolean}>
  }
  constructor() {
    this.events = {}
  }
}

后续就会慢慢看懂事件池为什么数据结构这样定义

2.定义消息发布
post(eventName: string, ...args: any[]) {
    const eventList = this.events[eventName]
    if (!eventList) return
    eventList.filter((item) => {
      const {fn, isOnce} = item
      fn(...args)
      return !isOnce
    })
  }

isOnce代表的是是否只订阅一次,filter函数return假值会返回一个空数组,那么对应的eventName中的订阅者就会清空,实现once的功能

3.定义消息订阅
register(eventName: string, fn: Function, isOnce: boolean=false) {
    if (!this.events[eventName]) {
      this.events[eventName] = []
    }
    this.events[eventName].push({fn, isOnce})
  }
4.定义消息只订阅一次
registerOnce(eventName: string, fn: Function) {
  this.register(eventName, fn, true)
}
5.定义消息取消订阅
unregister(eventName: string, fn: Function) {
    if (fn) {
      // 只取消订阅某个订阅者
      let eventList = this.events[eventName]
      eventList = eventList.filter(item => {
        return item.fn != fn
      })
    } else {
      // 根据消息名全部取消
      this.events[eventName] = []
    }
  }

好了,最重要的几个方法全部实现好了。主要思路就是根据一个个消息名来创建的一个无序对象,对象的value就是数组,保存订阅者的方法和isOnce。现在回过头来看

private events: {
    [key: string]: Array<{fn: Function, isOnce: boolean}>
  }

就比较清晰了

在 Nuxt2 使用 eventBus 事件总线,可以通过以下步骤实现: 1. 创建一个 eventBus.js 文件 在项目的根目录,创建一个 eventBus.js 文件,代码如下: ```javascript import Vue from 'vue'; export const eventBus = new Vue(); ``` 这里使用了 Vue 的实例来创建 eventBus,并且将它导出,这样就可以在项目的任何地方使用它了。 2. 在需要使用 eventBus 的组件引入 eventBus 在需要使用 eventBus 的组件,可以使用以下代码来引入 eventBus: ```javascript import {eventBus} from '@/eventBus.js'; ``` 这里的 @ 表示项目的根目录,如果 eventBus.js 文件不在根目录,那么需要改成相应的路径。 3. 使用 eventBus 发送事件 在需要发送事件的地方,可以使用以下代码来发送事件: ```javascript eventBus.$emit('eventName', data); ``` 这里的 eventName 是事件的名称,data 是传递的数据。 4. 使用 eventBus 监听事件 在需要监听事件的地方,可以使用以下代码来监听事件: ```javascript eventBus.$on('eventName', (data) => { // 处理事件 }); ``` 这里的 eventName 是事件的名称,data 是传递的数据。事件触发后,会执行回调函数的代码。 总结: 以上就是在 Nuxt2 使用 eventBus 事件总线的方法,通过使用 eventBus,可以在组件之间方便地进行通信。需要注意的是,eventBus 的使用需要谨慎,过多的使用可能会导致代码的可读性和维护性降低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

retun_true

穷不了你富不了我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值