this.$emit
描述:触发当前实例上的事件,附加参数都会传给监听器回调。
Vue.prototype.$emit = function (event) {
const vm = this
let cbs = vm._events[event] // 找到事件名对应的回调集合
if (cbs) {
const args = toArray(arguments, 1) // 将附加参数转为数组
for (let i = 0; i < cbs.length; i++) {
cbs[i].apply(vm, args) // 挨个执行对应的回调集合
}
}
return vm
}
首先从事件中心找到 事件名 对应的回调集合,然后将 $emit 其余参数转为 args 数组,最后挨个执行回调集合内的回调并传入 args。
简化版
emit(eventName, data) {
this.map[eventName] && this.map[eventName].forEach(fn => fn(data));
}
emit实现思路:我会接收两个参数,第一个参数是事件名,第二个参数是data。首先从事件中心找到 事件名 对应的回调集合,然后挨个执行回调集合内的回调并传入 data。