vue采用EventBus實(shí)現(xiàn)跨組件通信及注意事項(xiàng)小結(jié)
EventBus
EventBus是一種發(fā)布/訂閱事件設(shè)計(jì)模式的實(shí)踐。
在vue中適用于跨組件簡(jiǎn)單通信,不適應(yīng)用于復(fù)雜場(chǎng)景多組件高頻率通信,類(lèi)似購(gòu)物車(chē)等場(chǎng)景狀態(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ù)是事件對(duì)象,第二個(gè)參數(shù)是接收到消息信息,可以是任意類(lèi)型 * @method $on 事件訂閱, 監(jiān)聽(tīng)當(dāng)前實(shí)例上的自定義事件。https://cn.vuejs.org/v2/api/#vm-on * @method $off 取消事件訂閱,移除自定義事件監(jiān)聽(tīng)器。 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)聽(tīng)一個(gè)自定義事件,但是只觸發(fā)一次,在第一次觸發(fā)之后移除監(jiān)聽(tīng)器。 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) } } } 注冊(cè) //main.js import BUS from './service/bus' BUS(Vue)
注意事項(xiàng)
- 事件訂閱必須在事件廣播前注冊(cè);
- 取消事件訂閱必須跟事件訂閱成對(duì)出現(xiàn)。
使用場(chǎng)景
1.跨路由組件使用eventbus通信
假設(shè)a路由跳轉(zhuǎn)b路由需要通過(guò)eventbus通信,先觀察路由跳轉(zhuǎn)前后a,b組件的生命周期鉤子函數(shù),可以發(fā)現(xiàn)兩者是交叉執(zhí)行的。
由于事件訂閱必須在事件廣播前注冊(cè),所以事件訂閱可以放在b組件beforeCreate,created,beforeMout鉤子函數(shù)中,而事件廣播可以放在a組件的beforeDestroy,destroyed中。
取消事件訂閱必須跟事件訂閱成對(duì)出現(xiàn),否則會(huì)重復(fù)訂閱,對(duì)javascript性能造成不必要的浪費(fèi)。因此B組件銷(xiāo)毀前需取消當(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中即可。具體使用場(chǎng)景建議在兩組件分別打印生命鉤子函數(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 銷(xiāo)毀前狀態(tài)===============》') }, destroyed: function () { console.group('x組件 destroyed 銷(xiāo)毀完成狀態(tài)===============》') }
總結(jié)
以上所述是小編給大家介紹的vue采用EventBus實(shí)現(xiàn)跨組件通信及注意事項(xiàng)小結(jié),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
vue3使用xgPalyer實(shí)現(xiàn)截圖功能的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何在vue3中使用xgPalyer截圖功能,以及自定義插件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02Vue3+ElementUI 多選框中復(fù)選框和名字點(diǎn)擊方法效果分離方法
這篇文章主要介紹了Vue3+ElementUI 多選框中復(fù)選框和名字點(diǎn)擊方法效果分離方法,文中補(bǔ)充介紹了VUE-Element組件 CheckBox多選框使用方法,需要的朋友可以參考下2024-01-01vue實(shí)現(xiàn)把接口單獨(dú)存放在一個(gè)文件方式
這篇文章主要介紹了vue實(shí)現(xiàn)把接口單獨(dú)存放在一個(gè)文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08vue組件實(shí)現(xiàn)移動(dòng)端九宮格轉(zhuǎn)盤(pán)抽獎(jiǎng)
這篇文章主要為大家詳細(xì)介紹了vue組件實(shí)現(xiàn)移動(dòng)端九宮格轉(zhuǎn)盤(pán)抽獎(jiǎng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10vue3 elementPlus 表格實(shí)現(xiàn)行列拖拽及列檢索功能(完整代碼)
本文通過(guò)實(shí)例代碼給大家介紹vue3 elementPlus 表格實(shí)現(xiàn)行列拖拽及列檢索功能,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10vue v-for直接循環(huán)數(shù)字實(shí)例
今天小編就為大家分享一篇vue v-for直接循環(huán)數(shù)字實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Vue中this.$router.push參數(shù)獲取方法
下面小編就為大家分享一篇Vue中this.$router.push參數(shù)獲取方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02