EventBus 又称为事件总线。在Vue中可使用 EventBus 来做为组件传递数据的桥梁的,就像是全部组件共用相同的事件中心,能够向该中心注册发送事件或接收事件,因此组件均可以上下平行地通知其余组件,但也就是太方便因此若使用不慎,就会形成难以维护的灾难,所以才须要更完善的Vuex做为状态管理中心,将通知的概念上升到共享状态层次。vue
官方推荐的状态管理方案是 Vuex。不过若是项目不是很大,状态管理也没有很复杂的话,使用 Vuex 不必。
Vue.prototype.$EventBus = new Vue()
// Bus.js import Vue from 'vue' export const EventBus = new Vue();
你须要作的只是引入 Vue 并导出它的一个实例(在这种状况下,我称它为 EventBus )。实质上它是一个不具有 DOM 的组件,它具备的仅仅只是它实例方法而已,所以它很是的轻便。
如今咱们已经建立了 EventBus ,接下来你须要作到的就是在你的组件中加载它,而且调用同一个方法,就如你在父子组件中互相传递消息同样。函数
其实和 父子组件的通讯差很少,用 EventBus.$emit('emit事件名',数据)
发送, EventBus.$on("emit事件名", callback(payload1,…))
接受post
如今假设 A 组件与 B 组件通讯this
<!-- A.vue --> <template> <p>{{msgB}}</p> <button @click="sendMsgA()">-</button> </template> <script> import { EventBus } from "../Bus.js"; export default { data(){ return { msg: '' } }, mounted() { EventBus.$on("bMsg", (msg) => { // a组件接受 b发送来的消息 this.msg = msg; }); }, methods: { sendMsgA() { EventBus.$emit("aMsg", '来自A页面的消息'); // a 发送数据 } } }; </script> <!-- B.vue --> <template> <p>{{msgA}}</p> <button @click="sendMsgB()">-</button> </template> <script> import { EventBus } from "../event-bus.js"; export default { data(){ return { msg: '' } }, mounted() { EventBus.$on("aMsg", (msg) => { // b组件接受 a发送来的消息 this.msg = msg; }); }, methods: { sendMsgB() { EventBus.$emit("bMsg", '来自b页面的消息'); // b发送数据 } } }; </script>
若是只监听(接受)一次数据可使用 EventBus.$once('事件名', callback(payload1,…)
prototype
EventBus.$off('事件名', 回调函数)code
EventBus.$off('事件名', callback)
,只移除这个回调的监听器。EventBus.$off('事件名')
,移除该事件全部的监听器。EventBus.$off()
, 移除全部的事件监听器,注意不须要添加任何参数。// 导入咱们刚刚建立的 EventBus import { EventBus } from '../Bus.js' // 事件监听函数 const clickHandler = function(clickCount) { console.log(`Oh, hello)`) } // 开始监听事件 EventBus.$on('i-got-clicked', clickHandler); // 中止监听 EventBus.$off('i-got-clicked', clickHandler);
全局EventBus,虽然在某些示例中不提倡使用,但它是一种很是漂亮且简单的方法,能够跨组件之间共享数据。事件
它的工做原理是发布/订阅方法,一般称为 Pub/Sub 。ip
因为是全局的,必然全部事件都订阅它, 全部组件也发布到它,订阅组件得到更新。也就是说全部组件都可以将事件发布到总线,而后总线由另外一个组件订阅,而后订阅它的组件将获得更新。路由
全局事件总线只不过是一个简单的 vue 组件。get
var EventBus = new Vue(); Object.defineProperties(Vue.prototype, { $bus: { get: function () { return EventBus } } }) // 这个初始化的第一种方法,我的感受区别不大
在这个特定的总线中使用两个方法。一个用于建立发出的事件,它就是$emit;另外一个用于订阅$on:
this.$bus.$emit('nameOfEvent',{ ... pass some event data ...}); this.$bus.$on('nameOfEvent',($event) => { // ... })
vue篇之事件总线(EventBus)
使用 Vue.js 建立全局事件总线
Vue事件总线(EventBus)使用详细介绍