Vue组件通信中eventBus的使用

JavaScript014

Vue组件通信中eventBus的使用,第1张

原文链接: https://segmentfault.com/a/1190000013636153?utm_source=tag-newest

在vue1.0中,组件之间的通信主要通过vm.dispatch沿着父链向上传播和用vm.dispatch沿着父链向上传播和用vm.broadcast向下广播来实现。然而在vue2.0中,已经废除了这种用法。

vuex加入后,对组件之间的通信有了更加清晰的操作,对于中大型的项目来说,一开始就把vuex的使用计划在内是明智的选择。

然而在一些小型的项目,或者说像我这样写到一半才发现vue2.0用不了.broadcast和.broadcast和dispatch的人来说,就需要一个比较便捷的解决方法。那么,eventBus的作用就体现出来了。

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

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

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

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

想要在doClick()方法中,实现对show组件的通信,我们需要新建一个js文件,来创建出我们的eventBus,我们把它命名为bus.js

importVuefrom'vue'exportdefaultnewVue()

这样我们就创建了一个新的vue实例。接下来我们在click组件和show组件中import它。

importBusfrom'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。

来看一个实际例子:

我们创建了一个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和事件监听emit和事件监听on来实现通信和参数传递。图6,是为了在一个页面中,把selection.vue使用了至少两次,则我们点击任意一个selection.vue的同时,要把其它的selection.vue给收起来,如图7。

图1:

图2:

图3:

图4:

图5:

图6:

图7:

7:25,9:00,10:35,12:40,14:25,15:50都有,在汽车站坐车,车票是14元。

http://bus.js0573.com/bus.asp?k=海宁&d=1

上面是嘉善在线网址,你可以具体看一下。

张家港网上购买车票,新老车站有区别。

新车站(张家港长途汽车站)购票网址是:www.sqzjg.com (苏汽)

可以凭付费后自动生成的行程单(打印)直接上车,无需换票。或者在任何一个购票窗口凭借打印的行程单(主要是票号和密码)进行换票。

港城汽车站:http://bus.zjg.js.cn/# (金港热线)

买完票会有短信确认。带着短信,到检票口左侧的补票窗口兑换车票(通常不用排队)。

祝旅程愉快。