vue總線機(jī)制(bus)知識(shí)點(diǎn)詳解
vue中非父子組件之間通信除了使用vuex,也可以通過(guò)bus總線,兩者適用場(chǎng)景不同。
bus適合小項(xiàng)目、數(shù)據(jù)被更少組件使用的項(xiàng)目,對(duì)于中大型項(xiàng)目 數(shù)據(jù)在很多組件之間使用的情況 bus就不太適用了。bus其實(shí)就是一個(gè)發(fā)布訂閱模式,利用vue的自定義事件機(jī)制,在觸發(fā)的地方通過(guò)$emit向外發(fā)布一個(gè)事件,在需要監(jiān)聽的頁(yè)面,通過(guò)$on監(jiān)聽事件。
vuex適用中大型項(xiàng)目、數(shù)據(jù)在多組件之間公用的情況。
簡(jiǎn)單介紹兩者的區(qū)別之后,就要介紹下我在一個(gè)項(xiàng)目中遇到的一個(gè)場(chǎng)景了,這個(gè)場(chǎng)景使用bus可能更加適合些:
//main.js Vue.prototype.bus = new Vue(); new Vue({ render: h => h(App) ... }).$mount('#app'); /* *通過(guò)把一個(gè)vue實(shí)例賦于Vue構(gòu)造函數(shù)原型上的一個(gè)屬性bus(當(dāng)然起任何名稱都是可以的) *而每個(gè)Vue實(shí)例都是有$emit和$on方法的 *由于bus屬性在Vue原型上,根據(jù)原型鏈查找規(guī)則,在頁(yè)面中我們就可以通過(guò) this.bus.$emit 和 *this.bus.$on來(lái)進(jìn)行跨組件通信了 */
//導(dǎo)航欄組件中 //點(diǎn)擊事件發(fā)生時(shí)發(fā)布一個(gè)事件 this.bus.$emit('even-name',args1, arg2 , ...) //這里我們可以把點(diǎn)擊導(dǎo)航的相關(guān)信息攜帶出去
//路由顯示頁(yè)面中 this.bus.$on('event-name', (...args) => { //根據(jù)參數(shù)來(lái)進(jìn)行路由跳轉(zhuǎn) })
這個(gè)事件監(jiān)聽 和 路由跳轉(zhuǎn)的邏輯我們可以弄成一個(gè)mixins進(jìn)行復(fù)用。到這樣就完成了。
但是這樣還是有點(diǎn)麻煩,每個(gè)頁(yè)面都需要引入mixins,有沒有更好的辦法呢?答案是肯定的。我們項(xiàng)目導(dǎo)航欄是通過(guò)路由meta循環(huán)出來(lái)的,每項(xiàng)有對(duì)應(yīng)導(dǎo)航欄的路由,結(jié)構(gòu)如下:
{ path: '/xxxx', component: xxxx, meta: [ { name: '導(dǎo)航1' }, { name: '導(dǎo)航2', url: '我是導(dǎo)航2的路由' }, { name: '導(dǎo)航3', url: '我是導(dǎo)航3的路由' }, { name: '導(dǎo)航4', } ] },
在思索時(shí)我忽然發(fā)現(xiàn)每個(gè)導(dǎo)航欄的index、導(dǎo)航欄長(zhǎng)度length、及router.go方法之間有一個(gè)規(guī)律,那就是我們可以把index + 1 - length作為router.go的參數(shù),從而不用再關(guān)心query參數(shù)了,而且只需要在導(dǎo)航欄組件操作一次就可以了,完美!
//導(dǎo)航欄組件點(diǎn)擊事件處理函數(shù)中 if (url) { const meta = this.$route.meta; this.$router.go(index + 1 - meta.length) }
知識(shí)點(diǎn)補(bǔ)充:
將Bus注入到Vue根對(duì)象中
import Vue from 'vue' const Bus = new Vue() var app= new Vue({ el:'#app', data:{ Bus } })
在子組件中通過(guò)this.$root.Bus.$on(),this.$root.Bus.$emit()來(lái)調(diào)用
以上就是vue總線機(jī)制(bus)知識(shí)點(diǎn)詳解的詳細(xì)內(nèi)容,更多關(guān)于vue中總線機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue echarts封裝組件需求分析與實(shí)現(xiàn)
在平常的項(xiàng)目中,echarts圖表我們也是使用的非常多的,通常我們從后端拿到數(shù)據(jù),需要在圖表上動(dòng)態(tài)的進(jìn)行呈現(xiàn),接下來(lái)我們就模擬從后端獲取數(shù)據(jù)然后進(jìn)行呈現(xiàn)的方法,這篇文章主要介紹了Vue echarts封裝組件需求分析與實(shí)現(xiàn)2022-10-10vue實(shí)現(xiàn)登錄滑動(dòng)拼圖驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)登錄滑動(dòng)拼圖驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Vue中mixins的使用方法以及實(shí)際項(xiàng)目應(yīng)用指南
vue中提供了一種混合機(jī)制--mixins,用來(lái)更高效的實(shí)現(xiàn)組件內(nèi)容的復(fù)用,下面這篇文章主要給大家介紹了關(guān)于Vue中mixins的使用方法以及實(shí)際項(xiàng)目應(yīng)用指南,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03離線搭建vue環(huán)境運(yùn)行項(xiàng)目完整步驟
這篇文章主要給大家介紹了關(guān)于離線搭建vue環(huán)境運(yùn)行項(xiàng)目的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06vue-draggable實(shí)現(xiàn)拖拽表單的示例代碼
本文主要介紹了vue-draggable實(shí)現(xiàn)拖拽表單的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Antd-vue Table組件添加Click事件,實(shí)現(xiàn)點(diǎn)擊某行數(shù)據(jù)教程
這篇文章主要介紹了Antd-vue Table組件添加Click事件,實(shí)現(xiàn)點(diǎn)擊某行數(shù)據(jù)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11基于vue實(shí)現(xiàn)圖片驗(yàn)證碼倒計(jì)時(shí)60s功能
這篇文章主要介紹了基于vue實(shí)現(xiàn)圖片驗(yàn)證碼倒計(jì)時(shí)60s功能,本文通過(guò)截圖實(shí)例代碼的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Vue項(xiàng)目如何實(shí)現(xiàn)切換主題色思路
這篇文章主要介紹了Vue項(xiàng)目如何實(shí)現(xiàn)切換主題色思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01