Vue 2.0学习笔记:事件总线(EventBus)
特别声明:如果您喜欢小站的内容,可以点击申请会员进行全站阅读。如果您对付费阅读有任何建议或想法,欢迎发送邮件至: airenliao@gmail.com!或添加QQ:874472854(^_^)
许多现代JavaScript框架和库的核心概念是能够将数据和UI封装在模块化、可重用的组件中。这对于开发人员可以在开发整个应用程序时避免使用编写大量重复的代码。虽然这样做非常有用,但也涉及到组件之间的数据通讯。在Vue中同样有这样的概念存在。通过前面一段时间的学习,Vue组件数据通讯常常会有父子组件,兄弟组件之间的数据通讯。也就是说在Vue中组件通讯有一定的原则。
父子组件通讯原则
为了提高组件的独立性与重用性,父组件会通过props
向下传数据给子组件,当子组件有事情要告诉父组件时会通过$emit
事件告诉父组件。如此确保每个组件都是独立在相对隔离的环境中运行,可以大幅提高组件的维护性。
在《Vue组件通讯》一文中有详细介绍过这部分。但这套通讯原则对于兄弟组件之间的数据通讯就有一定的诟病。当然,在Vue中有其他的方式来处理兄弟组件之间的数据通讯,比如Vuex这样的库。但在很多情况之下,咱们的应用程序不需要类似Vuex这样的库来处理组件之间的数据通讯,而可以考虑Vue中的事件总线,即EventBus
。
接下来的内容,就是来一起学习Vue中的EventBus
相关的知识点。
EventBus的简介
EventBus
又称为事件总线。在Vue中可以使用EventBus
来作为沟通桥梁的概念,就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件,所以组件都可以上下平行地通知其他组件,但也就是太方便所以若使用不慎,就会造成难以维护的灾难,因此才需要更完善的Vuex作为状态管理中心,将通知的概念上升到共享状态层次。
如何使用EventBus
在Vue的项目中怎么使用EventBus
来实现组件之间的数据通讯呢?具体可以通过下面几个步骤来完成。
初始化
首先你需要做的是创建事件总线并将其导出,以便其它模块可以使用或者监听它。我们可以通过两种方式来处理。先来看第一种,新创建一个.js
文件,比如event-bus.js
:
// event-bus.js
import Vue from 'vue'
export const EventBus = new Vue()
你需要做的只是引入 Vue 并导出它的一个实例(在这种情况下,我称它为 EventBus
)。实质上它是一个不具备 DOM 的组件,它具有的仅仅只是它实例方法而已,因此它非常的轻便。
另外一种方式,可以直接在项目中的main.js
初始化EventBus
:
// main.js
Vue.prototype.$EventBus = new Vue()
注意,这种方式初始化的
EventBus
是一个全局的事件总线。稍后我们会花点时间专门聊一聊全局的事件总线。
现在我们已经创建了 EventBus
,接下来你需要做到的就是在你的组件中加载它,并且调用同一个方法,就如你在父子组件中互相传递消息一样。
发送事件
假设你有两个子组件:DecreaseCount
和IncrementCount
,分别在按钮中绑定了decrease()
和increment()
方法。这两个方法做的事情很简单,就是数值递减(增)1
,以及角度值递减(增)180
。在这两个方法中,通过EventBus.$emit(channel: string, callback(payload1,…))
监听decreased
(和incremented
)频道。
<!-- DecreaseCount.vue -->
<template>
<button @click="decrease()">-<