在学习 vue3 的过程中,发现 vue 的 vue.$on
、vue.$off
、vue.$once
方法废弃了,ESLint 建议我使用 mitt 代替。vue 说这是个侦听器(程序化的事件侦听器),可我想为什么不用 addEventListener()
呢,还要去找这个API(mitt),它们有什么区别?
我隐隐觉得 vue 说的侦听器可能和常用的 addEventListener
不是一个东西,便去找了下资料。找到了这篇博客:java监听器的原理与实现。
焕然大悟,原来这里 vue.$on
等实现的监听器,其实是监听器模式(观察者模式、订阅模式)。
我操起键盘,也撸了个出来:
function Mitt() {
this.events = new Map()
}
// 重写原型,定义 on emit off all 方法
Mitt.prototype = {
on: function(eventName, eventFunc) {
this.events.set(eventName,eventFunc)
},
// emit 触发的事件可能有多个参数?使用拓展操作符?
emit: function(eventName, eventParam1) {
this.events.get(eventName)(eventParam1)
},
off: function(eventName) {
this.events.delete(eventName);
},
all: function() {
return this.events
}
}
// 恢复原型的 constructor 属性
Object.defineProperty(Mitt.prototype, 'constructor', {
enumerable: false,
value: Mitt
})
之后,我又上 mitt 上看了下它是怎么写的,人家还是有一些高明的地方的,不亏这么多 star ,大家也可以去看看。