中央事件总线eventBus的实质就是创建一个vue实例,通过一个空的vue实例作为桥梁实现vue组件间的通信。它是实现非父子组件通信的一种解决方案。
eventBus 一般用法
而 eventBus实现也非常简单
import Vue from 'Vue'
export default new Vue
我们在使用中经常最容易忽视,又必然不能忘记的东西,那就是:清除事件总线 eventBus。
不手动清除,它是一直会存在,这样当前执行时,会反复进入到接受数据的组件内操作获取数据,原本只执行一次的获取的操作将会有多次操作。本来只会触发并只执行一次,变成了多次,这个问题就非常严重。
当不断进行操作几分钟后,页面就会卡顿,并占用大量内存。
所以一般在vue生命周期 beforeDestroy或者 destroyed中,需要用vue实例的 $off方法清除 eventBus
beforeDestroy () {
  bus.$off('click')
}
可当你有多个 eventBus时,就需要重复性劳动 $off销毁这件事儿。
这时候封装一个 eventBus就是更佳的解决方案。
拥有生命周期的 eventBus
我们从Vue.init中可以得知:
Vue.prototype._init = function () {
  const vm: Component = this
  // a uid vm实例唯一标识
  vm._uid = uid ++
  // ...
}
每个Vue实例有自己的 _uid作为唯一标识,因此我们让 EventBus和_uid`关联起来,并将其改造:

image.png
main.js中注册:
import EventBus from './eventBus.js'
Vue.use(EnemtBus)
组件中使用:
created () {
    /**
     * @description 订阅 on-change 事件
     * @param
     *   参数1 事件名
     *   参数2 事件传递参数
     *   参数3 默认为当前组件this,如果不传则需要手动销毁
     */
    this.$eventBus.$on('on-change', (...args) => {
      console.log(...args)
      //
    }, this)
  }
  methods () {
    onChangeHandle() {
      this.$eventBus.$emit('on-change', '传递参数1', '传递参数2')
    }
  },
  beforeDestroy () {
    // 不再需要手动销毁eventBus订阅事件
  }