问题
业务场景,需要在兄弟组件之间传值,选择了中央事件总线解决办法,如下
1 | // bus.js |
1 | // brother-a.vue |
1 | // brother-b.vue |
但是实际使用过程中发现问题 brother-b.vue 中没有监听到值
原因
因为 b 组件是动态生成的,此时没有 $on,无法监听到事件,也就是说
在$emit时,必须已经$on,否则将无法监听到事件,对组件是有一定的同时存在的要求的
为什么会这样呢?
中央事件总线的原理 是以一个Vue实例为桥梁,通过调用其$emit, $on事件实现组件的通信
查看Vue $emit源码如下
1 | // vue 2.6.2 |
在 emit 的时候会获取回调函数并执行,此时如果没有on监听函数,当新的组件生成on函数也就不被监听了也不会执行。
解决方法
- 可以使用Vuex
- 将 a 组件的值
this.$emit()传到了 父组件 , 在从父组件通过props传值到 b 组件