在Vue開發中會遇到大量的組件之間共享數據的情形,針對不一樣的情形,Vue有相對應的解決方案。好比,父組件向子組件傳值能夠使用props,複雜項目中不一樣模塊之間傳值能夠使用Vuex。可是,對於一些簡單的項目裏的非父子組件來講,它們一方面不適用props,另外一方面又沒有必要使用Vuex,針對這種情形能夠使用中央事件總線(Event Bus)來解決問題。vue
一、建立中央事件總線函數
能夠使用多種形式建立Event Bus。this
Example 1:spa
// main.js import Vue from 'vue'; window.eventBus = new Vue(); // 註冊全局事件對象 // 也能夠修改Vue的原型鏈 Vue.prototype.$event = new Vue();
Example 2:prototype
// ./event/moduleEvent.vue <tempalte> </template> <script> import Vue from 'vue'; export default new Vue({ data () { } }) </script> // main.js import moduleEvent from './event/moduleEvent'; Vue.prototype.$event = moduleEvent;
Example 3:code
// Example 2 中的建立eventBus的vue文件改成js文件,main.js不變 // ./event/moduleEvent.js inport Vue from 'vue'; export const moduleEvent = new Vue(); // main.js import moduleEvent from '../event/moduleEvent'; Vue.prototype.$event = moduleEvent;
二、使用中央事件總線傳值對象
先在組件A中發射事件:blog
// moduleA.vue methods: { sendData () { // 經過修改Vue原型鏈的方式註冊 this.$event.$emit('dataFromA', this.dataA); // 直接註冊在window上 // moduleEvent.$emit('dataFromA', this.dataA); } }
而後就能夠在組件B中接收了。組件B能夠與組件A是父子、兄弟等等任意關係。事件
// moduleB.vue methods: { getData () { // 經過修改Vue原型鏈的方式註冊 this.$event.$on('dataFromA', function (data) { // handle data code // 回調函數的參數data即爲組件A傳遞的值 }); // 直接註冊在window上 // moduleEvent.$emit('dataFromA', function (data) { // handle data code // 回調函數的參數data即爲組件A傳遞的值 // }); } }
三、單次接收事件或者移除事件Listenersip
若是你只想監聽一次該事件。能夠使用 this.$event.$once(channel: string, callback(payload1, payload2, ...)),事件觸發一次後將移除事件。
若是你想移除自定義事件監聽器,你能夠使用 this.$event.$off([event, callback]); 來實現。該方法若是沒有提供參數,則移除全部的事件監聽器;若是隻提供事件,則移除該事件全部的監聽器;若是同時提供了事件與回調,則只移除這個回調的監聽器。