小程序使用全局事件总线 Event Bus
- 在开发小程序的时候,有时需要做 页面之间的数据局部刷新或者组件间的状态更新,这个逻辑就非常复杂。
注意
- 我在实际开发过程中,主要是将Event Bus用在组件封装中,但是我觉得并不是特别好用,写这篇文章只是记录下
代码
- 注意在调用 on() 之后需要调用 off() 移除事件监听器,清除事件总线中的回调函数 
- 如果调用的是 once() 可以自动销毁 
js
// utils/eventBUs.js
// 全局事件总线
class EventBus {
  constructor() {
    this.eventList = {};
  }
  // 注册事件,仅执行一次
  once(eventName, callback) {
    const wrappedCallback = (data) => {
      callback(data);
      this.off(eventName, wrappedCallback);
    };
    this.on(eventName, wrappedCallback);
  }
  //注册
  on(eventName, callback) {
    if (!this.eventList[eventName]) {
      this.eventList[eventName] = [];
    }
    this.eventList[eventName].push(callback);
  }
  //移除
  off(eventName, callback) {
    const callbacks = this.eventList[eventName];
    if (callbacks) {
      const index = callbacks.indexOf(callback);
      if (index !== -1) {
        callbacks.splice(index, 1);
      }
    }
  }
  //触发
  emit(eventName, data) {
    const callbacks = this.eventList[eventName];
    if (callbacks) {
      callbacks.forEach(callback => {
        callback(data);
      });
    }
  }
}
module.exports = new EventBus();
调用
js
const eventBus = require('./eventBus');
const listener1 = (data) => {
  console.log('listener1:', data);
};
eventBus.once('customEvent', listener1);
eventBus.emit('customEvent', 'Hello World!');  // 输出: listener1: Hello World!
eventBus.emit('customEvent', 'Goodbye World!');  // 不会触发任何回调函数