鍍金池/ 問答/HTML/ vue bus $emit觸發(fā)第一次$on監(jiān)聽不到

vue bus $emit觸發(fā)第一次$on監(jiān)聽不到

圖片描述

回答
編輯回答
悶騷型
2018年4月23日 03:48
編輯回答
夏夕

為什么第一次不會被監(jiān)聽到?我的理解是$emit 先于 $on 執(zhí)行了,VUE并沒有儲存沒有監(jiān)聽的事件。

關(guān)于你說的第二次可以是因?yàn)槟阒苯訄?zhí)行了函數(shù) vm.$bus.on(event, vm.fetchDate())你直接執(zhí)行了... 執(zhí)行了...

以下是VUE的事件源碼:

 Vue.prototype.$emit = function (event: string): Component {
    const vm: Component = this
    if (process.env.NODE_ENV !== 'production') {
        ...
    }
    let cbs = vm._events[event]  // vm._events儲存監(jiān)聽事件的容器  如果沒有先$on監(jiān)聽的話 cbs就是undefined 所以就不會運(yùn)行
    if (cbs) {
      /*將類數(shù)組的對象轉(zhuǎn)換成數(shù)組*/
      cbs = cbs.length > 1 ? toArray(cbs) : cbs
      const args = toArray(arguments, 1)
      /*遍歷執(zhí)行*/
      for (let i = 0, l = cbs.length; i < l; i++) {
        cbs[i].apply(vm, args)
      }
    }
    return vm
  }

所以,異步等到事件注冊了再監(jiān)聽好了

2017年5月12日 09:35
編輯回答
懶豬

放棄了bus,換了另一種方式解決了當(dāng)前需求問題

2018年3月21日 06:34
編輯回答
大濕胸

看了發(fā)條橙子的回答,我用個定時器解決了

setTimeout(() => {
  Hub.$emit('basis', this.id)
}, 30)
2017年10月4日 16:49