vue2.0+中eventBus实现兄弟组件通信

在实现业务的时候,出现一个奇怪的Tree需求:

a.vue中包含list.vue和update.vue两个组件,list.vue中包含公用tree组件。需要做到的功能是update保存成功的时候重新获取list.vue的数据。但是为了降低公用组件的耦合度,又不能使用vuex.

在vue1.0中,这样的通信可以通过vm. dispatch沿vm. broadcast向下广播来实现。然而在vue2.0中,已经废除了这种用法。

此时,就需要用到eventBus了。

主要是现实途径是在要相互通信的兄弟组件之中,都引入一个新的vue实例,然后通过分别调用这个实例的事件触发和监听来实现通信和参数传递。

这里来看一个简单的例子:

比如,我们这里有三个组件,main.vue、click.vue、show.vue。click和show是父组件main下的兄弟组件,而且click是通过v-for在父组件中遍历在了多个列表项中。这里要实现,click组件中触发点击事件后,由show组件将点击的是哪个dom元素console出来。

首先,我们给click组件添加点击事件

<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它。

import Bus from 'common/js/bus.js';  

接下来,我们在doClick方法中,来触发一个事件:

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为好。

猜你喜欢

转载自blog.csdn.net/chern1992/article/details/79994645