美文网首页
自定义事件总线

自定义事件总线

作者: 咸鱼不咸_123 | 来源:发表于2022-05-26 20:53 被阅读0次

1.自定义事件总线

  • 自定义事件总线属于一种观察者模式,其中包括三个角色:

    • 发布者(Publisher):发出事件(Event)
    • 订阅者(Subscriber):订阅事件(Event)、并且会进行响应(Handler)
    • 事件总线(EventBus):无论是发布者还是订阅者都是通过事件总线作为中台的。
  • 当然我们可以选择一些第三方的库

    • Vue2默认是带有事件总线的功能

    • Vue3中推荐一些第三方库,比如mitt

  • 当然我们也可以实现自己的事件总线
    • 事件的监听方法on
    • 事件的发射方法emit
    • 事件的取消监听off
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","哈哈哈哈");

相关文章

  • 自定义事件总线

    1.自定义事件总线 自定义事件总线属于一种观察者模式,其中包括三个角色:发布者(Publisher):发出事件(E...

  • Vue父子组件间通信(数据传递)

    父---props--->子子---props/自定义事件/全局事件总线/消息订阅与发布--->父任意组件间通信:...

  • 1.组件通信

    常见的组件通信方式 props(父传子) 自定义事件(子传父) eventbus(事件总线) vuex 不常用的组...

  • Vue 组件之间通信

    父给子传值 prop 子给父 $emit ref 自定义事件 通过 ref 事件总线: 消息订阅与发布

  • RxJava实现事件总线(RxBus)学习笔记

    目录事件总线的介绍利用RxJava实现事件总线(Rxbus)Rxbus的使用 事件总线的介绍 1. 什么是事件总线...

  • 事件总线

    自定义事件总线属于一种观察者模式,其中包括三个角色: 发布者(Publisher):发出事件(Event); 订阅...

  • 事件总线知多少(1)

    源码路径:Github-EventBus事件总线知多少(1)事件总线知多少(2) 1. 引言 事件总线这个概念对你...

  • vue最全的组件通信和插槽,看这一篇就够了

    组件通信常用方式props父给子传值 自定义事件子给父传值$emit $bus事件总线任意两个组件之间传值常用事件...

  • 事件总线知多少(2)

    源码路径:Github-EventBus事件总线知多少(1)事件总线知多少(2) 1.引言 之前的一篇文章事件总线...

  • 使用JavaScript手写一个事件总线功能

    事件总线 事件总线主要是实现一些任意的或非父子关系的组件之间的数据通信 实现一个事件总线功能需要: 事件派发 $...

网友评论

      本文标题:自定义事件总线

      本文链接:https://www.haomeiwen.com/subject/fsjpprtx.html