Skip to content

JavaScript 事件总线

提示

事件总线是一种在前端应用中实现组件间通信的机制,它基于发布-订阅模式(Pub-Sub),允许不直接关联的组件之间进行通信。

发布(emit): 发布一个事件

订阅(on): 监听一个事件

取消订阅(off): 移除事件监听

实现事件总线

利用对象类型数据的存储原理,引用地址不变,状态以此共享

ts
class EventBus {
  constructor() {
    this.events = {};
  }

  on(eventName, callback) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].push(callback);
  }

  emit(eventName, ...args) {
    if (this.events[eventName]) {
      this.events[eventName].forEach(cb => cb(...args));
    }
  }

  off(eventName, callback) {
    if (this.events[eventName]) {
      this.events[eventName] = this.events[eventName].filter(
        cb => cb !== callback
      );
    }
  }

  once(eventName, callback) {
    const onceWrapper = (...args) => {
      callback(...args);
      this.off(eventName, onceWrapper);
    };
    this.on(eventName, onceWrapper);
  }
}

// 使用示例
const bus = new EventBus();
bus.on('message', (msg) => console.log(msg));
bus.emit('message', 'Hello World!');

vue 中的内置事件总线

ts
// event-bus.js
import Vue from 'vue';
export const EventBus = new Vue();

// 组件A - 发布事件
EventBus.$emit('event-name', payload);

// 组件B - 订阅事件
EventBus.$on('event-name', payload => {
  // 处理事件
});

// 组件B - 取消订阅
EventBus.$off('event-name');

第三方包

mitt: 超轻量级(200字节)事件总线