evtBus的简易实现

106 阅读1分钟
```//极简全局evtbus实现
function evtBus() {
  this.evt = new Map();
}
//注册事件
evtBus.prototype.on = function(keys, fn) {
  const { evt } = this;
  Array.isArray(keys) || (keys = [keys]);
  keys.forEach(key => {
    (evt.has(key) && evt.get(key).push(fn)) || evt.set(key, [fn]);
  });
};
//发送事件
evtBus.prototype.emit = function(key, ...data) {
  const arr = this.evt.get(key);
  arr && arr.forEach(fn => fn(...data));
};
//移除事件
evtBus.prototype.off = function(keys) {
  const { evt } = this;
  if (!keys) {
    return evt.clear();
  }
  if (Array.isArray(keys)) {
    return keys.forEach(key => evt.delete(key));
  }
  evt.delete(keys);
};
//调用一次移除
evtBus.prototype.once = function(key, fn) {
  let onceFn = (...data) => {
    this.off(key);
    fn(...data);
  };
  this.on(key, onceFn);
};

export const bus = new evtBus();