Vue中发布订阅模式
在Vue中采用了发布订阅模式,典型的兄弟组件间的通信
$on
和$emit
发布订阅模式:(订阅者、发布者、信号中心)
一个发布者$emit
发布一个事件到信号中心eventBus
,订阅者们$on
通过信号中心收到该事件,进行处理
在这里模拟一个自定义事件 $on和$emit
事件
class EventBus{
constructor(){
// 1.处理事件对应的处理函数
this.sub = {}
}
$on(event,fn){
if(!this.sub[event]){
// 2.判断sub是否已经存在该事件了,没有的话就赋值一个数组,用来存储触发函数
this.sub[event] = []
}
// 3.将函数push到对应的事件中
this.sub[event].push(fn)
}
$emit(event){
if(this.sub[event]){
this.sub[event].forEach(fn=>{
fn() //4.执行对应事件中的处理函数
})
}
}
}
// 信号中心
const vm = new EventBus()
// 订阅事件
vm.$on('click',()=>{console.log('触发了click事件')})
vm.$on('change',()=>{console.log('触发了change事件')})
// 发布订阅
vm.$emit('click')
vm.$emit('change')