自定义事件总线

2022-05-26  本文已影响0人  咸鱼不咸_123

1.自定义事件总线

class JYEventBus{
  constructor(){
    this.eventBus={}
  }

  // * 监听,可以监听对次
  on(eventName,eventCallback,thisArg){
    let handlers=this.eventBus[eventName];
    if(!handlers){
      handlers=[];
      this.eventBus[eventName]=handlers;
    }
    handlers.push({
      thisArg,
      eventCallback
    });
  }

  off(eventName,eventCallback){
    let 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){
       handlers.forEach(handler=>{
        handler.eventCallback.apply(handler.thisArg,payload);
       })
     }
  }
}

const eventBus=new JYEventBus();

// main.js
eventBus.on("abc",function(v){
 console.log("监听1vvv",v,this);
},{name:"why"})

// main.js
const handleCallback=function(v){
  console.log("监听2vvv",v,this);
 }
eventBus.on("abc",handleCallback,{name:"why"})
// utils.js
eventBus.emit("abc",123);

eventBus.off("abc",handleCallback)

eventBus.emit("abc","哈哈哈哈");
上一篇 下一篇

猜你喜欢

热点阅读