Vue全局事件总线(GlobalEventBus)的实现原理

Vue全局事件总线(GlobalEventBus)的实现原理

它不是一个新的 API,是众多开发者总结出来的经验,能实现任意组件间都能通信

那要怎么样才能实现这个任意组件间通信呢?

  1. 保证所有人都能看到它
  2. 并且能够调用$on、$off、$emit方法

有一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype

假如我在 Vue 的原型对象身上加个 x 属性,那么要怎么样才能顺着 x 找到 Vue 原型对象身上的方法呢(因为$on、$off、$emit在原型对象上)?vc 或 vm 都能调用原型身上的方法

  • 想法一,比较麻烦

    const Demo = Vue.extend({})
    const d = new Demo()
    Vue.prototype.x = d
    //这样x就是vc,它就能调用到Vue原型身上的方法
    
  • 想法二(推荐)

    new Vue({
      render: h => h(App),
      beforeCreate() {
          Vue.prototype.$bus = this
      }  
    }).$mount('#app')
    //this就是vm
    

tips:

我们不用去 new Vuecomponent(),只有写了组件标签,就会自动帮我们去 new

posted @ 2022-07-05 17:44  朱在春  阅读(298)  评论(0编辑  收藏  举报