Pubsub(订阅与发布)、EventBus(事件总线)

本文介绍了如何在组件间使用pubsub-js库实现发布订阅模式,通过下载、引入和实际操作,展示了事件总线的概念,包括事件名称、回调函数、发布和订阅参数。重点讲解了事件总线的工作原理及在Vue等框架中的应用。
摘要由CSDN通过智能技术生成

介绍

用于组件之间通信,可以实现任意组件的通信
发布订阅模式

使用

下载

npm i pubsub-js -s

引入,用到的文件都要引入

import pubsub from 'pubsub-js'

发布

pubsub.publish("hello", 666)

订阅

this.d_pid = pubsub.subscribe("hello", (msgName, data) => {
      console.log("有人发布了hello消息," + msgName + "回调执行了,收到数据:" + data);
      //有人发布了hello消息,hello回调执行了,收到数据:666
})

订阅参数解释

PubSub.subscribe(name,(meg,data)=>{})
第一个参数是订阅的事件
第二个参数是别人发布了订阅以后执行的函数,接收的meg是事件名字name的值,data是别人发布订阅传递过来的数据

发布参数解释

pubsub.publish(name,data)
第一个参数是发布事件(与订阅事件同名,才能对接)
第二个是传递参数

this.d_pid : 作为标识(销毁的时候好销毁)
组件销毁时,一定要及时清除订阅事件

事件总线

事件总线,说白了就是一个对象,它有一个events对象,里面存了一些键值对,键值为callback(回调函数,记住回调函数的作用域取决于所定义的时候),还有emit事件,就是拿到events对象中属性对应的键值,就是对应的回调函数,然后把参数加进去,执行即可。其它的取消对应的事件和取消全部事件就更简单了。
我们在用的时候,例如Vue,我们直接生成一个实例,挂载到Vue全局对象上即可,当然这里说的是Vue2版本,总之要保证我们订阅发布操作要再同一个实例上。如果不在同一个实例对象上就没有什么意义。

我们来用代码实现一下事件总线

type Callback<T> = (payload: T) => void;

class EventBus<T> {
    private events: { [event: string]: Array<Callback<T>> } = {};
	// 注册事件
    on(event: string, callback: Callback<T>): void {
        if (!this.events[event]) {
            this.events[event] = [];
        }
        this.events[event].push(callback);
    }
	// 发射事件
    emit(event: string, payload: T): void {
        if (this.events[event]) {
            this.events[event].forEach(callback => {
                callback(payload);
            });
        }
    }
	// 取消事件
    off(event: string, callback: Callback<T>): void {
        if (this.events[event]) {
            this.events[event] = this.events[event].filter(cb => cb !== callback);
        }
    }
	// 清空事件
    clear(): void {
        this.events = {}
    }
}

我们首先定义了一个泛型类 EventBus,它接受一个类型参数 T,表示事件携带的数据类型。接着,我们定义了一个类型别名 Callback,它表示一个回调函数,它接受一个类型为 T 的参数,并返回 void。然后,我们在 EventBus 类中使用了一个对象来存储事件名称和对应的回调函数,以及 on、emit 和 off 三个方法来注册、触发和移除事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李和贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值