# 自定义事件总线
- 自定义事件总线属于一种观察者模式,其中包括三个角色:
- 发布者(Publisher):发出事件(Event)
- 订阅者(Subscriber):订阅事件(Event),并且会进行响应(Handler)
- 事件总线(EventBus):无论是发布者还是订阅者都是通过事件总线作为中台的
- 当然我们可以选择一些第三方的库:
- Vue2 默认是带有事件总线的功能
- Vue3 中推荐一些第三方库,比如 mitt
- 当然我们也可以实现自己的事件总线:
- 事件的监听方法 on
- 事件的发射方法 emit
- 事件的取消监听 off
# _EventBus 实现
| class _EventBus { |
| constructor() { |
| this.eventBus = {} |
| } |
| |
| on(eventName, eventCallback, thisArg) { |
| |
| let handlers = this.eventBus[eventName] |
| if (!handlers) { |
| handlers = [] |
| this.eventBus[eventName] = handlers |
| } |
| |
| |
| handlers.push({ |
| eventCallback, |
| thisArg |
| }) |
| } |
| |
| off(eventName, eventCallback) { |
| const handlers = this.eventBus[eventName] |
| if (!handlers) return |
| const newHandlers = [...handlers] |
| |
| for (let i = 0; i < newHandlers.length; i++){ |
| const handler = newHandlers[i] |
| if (handler.eventCallback === eventCallback) { |
| const index = handlers.indexOf(handler) |
| handlers.splice(index, 1) |
| } |
| } |
| } |
| |
| emit(eventName, ...payload) { |
| const handlers = this.eventBus[eventName] |
| if (!handlers) return |
| handlers.forEach(handler => { |
| handler.eventCallback.apply(handler.thisArg, payload) |
| }) |
| } |
| |
| } |