在vue1.0中,组件之间的通讯主要经过vm.$dispatch沿着父链向上传播和用vm.$broadcast向下广播来实现。然而在vue2.0中,已经废除了这种用法。vue
vuex加入后,对组件之间的通讯有了更加清晰的操做,对于中大型的项目来讲,一开始就把vuex的使用计划在内是明智的选择。vuex
然而在一些小型的项目,或者说像我这样写到一半才发现vue2.0用不了$.broadcast和$dispatch的人来讲,就须要一个比较便捷的解决方法。那么,eventBus的做用就体现出来了。dom
主要是现实途径是在要相互通讯的兄弟组件之中,都引入一个新的vue实例,而后经过分别调用这个实例的事件触发和监听来实现通讯和参数传递。spa
这里来看一个简单的例子:code
好比,咱们这里有三个组件,main.vue、click.vue、show.vue。click和show是父组件main下的兄弟组件,并且click是经过v-for在父组件中遍历在了多个列表项中。这里要实现,click组件中触发点击事件后,由show组件将点击的是哪一个dom元素console出来。对象
首先,咱们给click组件添加点击事件blog
<div class="click" @click.stop.prevent="doClick($event)"></div>
想要在doClick()方法中,实现对show组件的通讯,咱们须要新建一个js文件,来建立出咱们的eventBus,咱们把它命名为bus.js事件
import Vue from 'vue'; export default new Vue();
这样咱们就建立了一个新的vue实例。接下来咱们在click组件和show组件中import它。ip
import Bus from 'common/js/bus.js';
接下来,咱们在doClick方法中,来触发一个事件:get
methods: { addCart(event) { Bus.$emit('getTarget', event.target); } }
这里咱们在click组件中每次点击,都会在bus中触发这个名为'getTarget'的事件,并将点击事件的event.target顺着事件传递出去。
接着,咱们要在show组件中的created()钩子中调用bus监听这个事件,并接收参数:
created() { Bus.$on('getTarget', target => { console.log(target); }); }
这样,在每次click组件的点击事件中,就会把event.target传递到show中,并console出来。
因此eventBus的使用仍是很是便捷的,可是若是是中大型项目,通讯比较复杂,仍是建议你们直接使用vuex。
来看一个实际例子:
咱们建立了一个selection.vue的下拉框组件,在layout.vue组件中使用了selection.vue组件,咱们要实现点击layout.vue组件页面的任意一处(除下拉框组件自己外),均可以将下拉框收起来。首先,新建了一个eventBus.js文件,在里面新建了一个vue的实例赋值给const eventBus,在selection.vue和layout.vue中分别import eventBus from '../../eventBus'和import eventBus from '../eventBus',则eventBus对于selection.vue和layout.vue就是一个全局的vue实例对象,而后经过分别调用eventBus这个实例的事件触发$emit和事件监听$on来实现通讯和参数传递。图6,是为了在一个页面中,把selection.vue使用了至少两次,则咱们点击任意一个selection.vue的同时,要把其它的selection.vue给收起来,如图7。
图1:
图2:
图3:
图4:
图5:
图6:
图7: