这些方法都是通过 eventsMixin() 方法进行初始化挂载在Vue原型上。

eventsMixin()的位置:

eventsMixin的实现逻辑:

把 $on、$once、$off、$emit 方法添加到Vue的原型上。

$on:

支持传入 单个事件名、或者事件名数组,

如果是数组,那么遍历调用$on(),把事件添加到组件实例的_events对象上

添加到事件列表中,事件列表的存在 _events这个对象上,每个key就是事件名,每个value就是事件的回调函数。

比方添加一个事件名为example的事件,那么

const vm = {
  _events: {
    example: [fn1, fn2, fn3]
  }
}

$off

如果没有传递参数,那么就会清空当前组件实例的所有自定义事件的监听。慎用

Vue.prototype.$off = function (
   event?: string | Array<string>,
   fn?: Function
 ): Component {
   const vm: Component = this
   if (!arguments.length) {
     vm._events = Object.create(null)
     return vm
   }
 }