赞
踩
Vue中有一个非常核心的功能,就是EventBus事件派发机制,这种机制在前端很多领域都有应用,甚至在其它语言中也是非常重要的内容。在Vue3中框架内已经移除了这种机制,官方的回答大概意思是,这种东西应该用户自己实现,不应该由框架提供。所以我们试着实现一下
今天我们主要实现on
,once
,off
,trigger
这四个方法
class eventBus {
constructor () {
this.eventMap = {};
}
addEventListener (eventName, fn, isOnce) {
const taskObj = { fn, isOnce };
if (!this.eventMap[eventName]) {
this.eventMap[eventName] = [taskObj];
} else {
this.eventMap[eventName].push(taskObj);
}
}
on (eventName, fn) {
this.addEventListener(eventName, fn, false);
}
once (eventName, fn) {
this.addEventListener(eventName, fn, true);
}
off (eventName) {
this.eventMap[eventName] = [];
}
trigger (eventName) {
const tasks = this.eventMap[eventName];
const onceTasks = [];
tasks && tasks.forEach((item, index) => {
const { fn, isOnce } = item;
fn && fn();
if (isOnce) {
onceTasks.push(index);
}
})
onceTasks.forEach((index) => {
this.eventMap[eventName].splice(index, 1);
})
}
}
首先是on
方法,on
方法的主要作用就是挂载事件。提供事件的名字和事件本身。这里挂载事件的操作,我们抽离成一个addEventListener
方法来进行挂载。挂载过程也比较简单,就是判断eventMap
这个总对象上是否存在这个事件的名字,存在就push
进去,不存在就创建。
isOnce
参数是为了配合实现once
方法,因为on
和once
都复用addEventListener
。
once
跟on
其实非常非常类似,最大的区别是once
挂载的事件只触发一次。on
挂载的事件如果不主动移除,会一直存在。once
方法同样需要提供事件的名字和事件本身。
off
是移除事件的方法,比如我用on
挂载了某个事件之后,因为一些原因要移除,就可以用off
方法,只需要提供事件的名字即可
trigger
是触发事件的方法,需要提供事件的名字。会执行这个事件名字下挂载的所有事件。我们需要解构出isOnce
属性来判断执行完之后是否需要移除这个事件。
EventBus
事件派发机制,其实总体实现上,并不是很难。需要一些设计模式的思维。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。