vue采用EventBus實(shí)現(xiàn)跨組件通信及注意事項(xiàng)小結(jié)
EventBus
EventBus是一種發(fā)布/訂閱事件設(shè)計(jì)模式的實(shí)踐。
在vue中適用于跨組件簡單通信,不適應(yīng)用于復(fù)雜場景多組件高頻率通信,類似購物車等場景狀態(tài)管理建議采用vuex。

掛載EventBus到vue.prototype
添加bus.js文件
//src/service/bus.js
export default (Vue) => {
const eventHub = new Vue()
Vue.prototype.$bus = {
/**
* @param {any} event 第一個(gè)參數(shù)是事件對象,第二個(gè)參數(shù)是接收到消息信息,可以是任意類型
* @method $on 事件訂閱, 監(jiān)聽當(dāng)前實(shí)例上的自定義事件。https://cn.vuejs.org/v2/api/#vm-on
* @method $off 取消事件訂閱,移除自定義事件監(jiān)聽器。 https://cn.vuejs.org/v2/api/#vm-off https://github.com/vuejs/vue/issues/3399
* @method $emit 事件廣播, 觸發(fā)當(dāng)前實(shí)例上的事件。 https://cn.vuejs.org/v2/api/#vm-emit
* @method $once 事件訂閱, 監(jiān)聽一個(gè)自定義事件,但是只觸發(fā)一次,在第一次觸發(fā)之后移除監(jiān)聽器。 https://cn.vuejs.org/v2/api/#vm-once
*/
$on (...event) {
eventHub.$on(...event)
},
$off (...event) {
eventHub.$off(...event)
},
$once (...event) {
eventHub.$emit(...event)
},
$emit (...event) {
eventHub.$emit(...event)
}
}
}
注冊
//main.js
import BUS from './service/bus'
BUS(Vue)
注意事項(xiàng)
- 事件訂閱必須在事件廣播前注冊;
- 取消事件訂閱必須跟事件訂閱成對出現(xiàn)。
使用場景
1.跨路由組件使用eventbus通信
假設(shè)a路由跳轉(zhuǎn)b路由需要通過eventbus通信,先觀察路由跳轉(zhuǎn)前后a,b組件的生命周期鉤子函數(shù),可以發(fā)現(xiàn)兩者是交叉執(zhí)行的。
由于事件訂閱必須在事件廣播前注冊,所以事件訂閱可以放在b組件beforeCreate,created,beforeMout鉤子函數(shù)中,而事件廣播可以放在a組件的beforeDestroy,destroyed中。
取消事件訂閱必須跟事件訂閱成對出現(xiàn),否則會(huì)重復(fù)訂閱,對javascript性能造成不必要的浪費(fèi)。因此B組件銷毀前需取消當(dāng)前事件訂閱。

A組件
beforeDestroy () {
//事件廣播
this.$bus.$emit('testing', color)
}
B組件
created () {
//事件訂閱
this.$bus.$on('testing', (res) => { console.log(res) })
},
beforeDestroy () {
this.$bus.$off('testing')
}
2.普通跨組件通信:由于兩組件幾乎同時(shí)加載,因此建議事件廣播放在created鉤子內(nèi),事件訂閱放在mouted中即可。具體使用場景建議在兩組件分別打印生命鉤子函數(shù)進(jìn)行準(zhǔn)確判斷。
beforeCreate: function () {
console.group('A組件 beforeCreate 創(chuàng)建前狀態(tài)===============》')
},
created: function () {
console.group('A組件 created 創(chuàng)建完畢狀態(tài)===============》')
},
beforeMount: function () {
console.group('x組件 beforeMount 掛載前狀態(tài)===============》')
},
mounted: function () {
console.group('x組件 mounted 掛載結(jié)束狀態(tài)===============》')
},
beforeUpdate: function () {
console.group('x組件 beforeUpdate 更新前狀態(tài)===============》')
},
updated: function () {
console.group('x組件 updated 更新完成狀態(tài)===============》')
},
beforeDestroy: function () {
console.group('x組件 beforeDestroy 銷毀前狀態(tài)===============》')
},
destroyed: function () {
console.group('x組件 destroyed 銷毀完成狀態(tài)===============》')
}
總結(jié)
以上所述是小編給大家介紹的vue采用EventBus實(shí)現(xiàn)跨組件通信及注意事項(xiàng)小結(jié),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
vue觸發(fā)真實(shí)的點(diǎn)擊事件跟用戶行為一致問題
這篇文章主要介紹了vue觸發(fā)真實(shí)的點(diǎn)擊事件跟用戶行為一致問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
vue移動(dòng)端實(shí)現(xiàn)紅包雨效果
這篇文章主要為大家詳細(xì)介紹了vue移動(dòng)端實(shí)現(xiàn)紅包雨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
vue3中的對象時(shí)為proxy對象如何獲取值(兩種方式)
使用vue3.0時(shí),因?yàn)榈讓邮鞘褂胮roxy進(jìn)行代理的所以當(dāng)我們打印一些值得時(shí)候是proxy代理之后的是Proxy<BR>對象,Proxy對象里邊的[[Target]]才是真實(shí)的對象,那么如何獲取這個(gè)值呢,下面下面給大家介紹兩種方式,感興趣的朋友一起看看吧2023-01-01
vue使用 better-scroll的參數(shù)和方法詳解
這篇文章主要介紹了vue使用 better-scroll的參數(shù)和方法詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
vue中多個(gè)倒計(jì)時(shí)實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了vue中多個(gè)倒計(jì)時(shí)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

