Vue中事件總線(eventBus)的深入詳解及使用
1. 簡(jiǎn)介
Vue 組件中常見(jiàn)的有:父子組件通信、兄弟組件通信。而父子組件通信就很簡(jiǎn)單,父組件會(huì)通過(guò) props 向下傳數(shù)據(jù)給子組件,當(dāng)子組件有事情要告訴父組件時(shí)會(huì)通過(guò) $emit 事件告訴父組件。
今天就來(lái)說(shuō)說(shuō),如果兩個(gè)頁(yè)面沒(méi)有任何引入和被引入關(guān)系,該如何通信呢?
如果應(yīng)用程序不需要類似 Vuex 這樣的庫(kù)來(lái)處理組件之間的數(shù)據(jù)通信,就可以考慮 Vue 中的事件總線 ,即 eventBus 來(lái)通信。
eventBus 又稱為事件總線。在 Vue 中可使用 eventBus 來(lái)作為溝通橋梁的概念,就像是所有組件共用相同的事件中心,可向該中心注冊(cè)發(fā)送事件或接收事件,所以組件都可以上下平行地通知其他組件。但也就是太方便所以若使用不慎,就會(huì)造成難以維護(hù)的“災(zāi)難”,因此才需要更完善的 Vuex 作為狀態(tài)管理中心,將通知的概念上升到共享狀態(tài)層次。
2. 使用
可以聲明一個(gè)全局變量來(lái)使用事件中心,但如果在使用 webpack 之類的模塊系統(tǒng),這顯然不合適。
每次使用都手動(dòng) import 進(jìn)來(lái)也很不方便,所以本文使用 vue-bus 插件。
安裝及引入
npm install vue-bus --save
如果在一個(gè)模塊化工程中使用它,必須要通過(guò) Vue.use() 明確地安裝 vue-bus:
// main.js import Vue from 'vue'; import VueBus from 'vue-bus'; Vue.use(VueBus);
在組件中使用
假設(shè)有兩個(gè)Vue組件需要通信 ,在 A 組件的按鈕上面綁定了點(diǎn)擊事件發(fā)送一則消息,想通知 B 組件。
// A 組件
<template>
<div class="wrap">
<button @click="sendMsg">觸發(fā)</button>
</div>
</template>
<script>
export default {
data(){
return {
Amsg:'我是來(lái)自A組件的信息',
}
},
methods:{
sendMsg(){
this.$bus.emit('changeMsg', this.Amsg );
this.$bus.emit('doOnce','我只會(huì)觸發(fā)一次');
}
},
}
</script>
// B 組件
<template>
<div>
<h3>{{Bmsg}}</h3>
</div>
</template>
<script>
export default {
data(){
return {
Bmsg:'我是B組件',
}
},
methods:{
getMsg(msg){
this.Bmsg = msg;
console.log(msg);
}
},
created(){
/*
* 接收事件
* 這種寫法也體現(xiàn)了:A 組件調(diào)用 B 組件中的方法。如果只是傳遞數(shù)據(jù),可參考如下簡(jiǎn)化寫法:
* this.$bus.on('changeMsg', (msg) => { this.Bmsg = msg });
*/
this.$bus.on('changeMsg', this.getMsg);
// 此偵聽(tīng)器只會(huì)觸發(fā)一次
this.$bus.once('doOnce', (txt) => { console.log(txt) });
},
// 組件銷毀時(shí),移除EventBus事件監(jiān)聽(tīng)
beforeDestroy() {
this.$bus.off('changeMsg', this.addTodo);
},
}
</script>
當(dāng)我們點(diǎn)擊5次觸發(fā)按鈕時(shí),效果如下:

補(bǔ)充:移除監(jiān)聽(tīng)事件
為了避免在監(jiān)聽(tīng)時(shí),事件被反復(fù)觸發(fā),通常需要在頁(yè)面銷毀時(shí)移除事件監(jiān)聽(tīng)?;蛘咴陂_(kāi)發(fā)過(guò)程中,由于熱更新,事件可能會(huì)被多次綁定監(jiān)聽(tīng),這時(shí)也需要移除事件監(jiān)聽(tīng)。
//使用方式一定義時(shí)
this.$EventBus.$off('eventName');
//使用方式二定義時(shí)
EventBus.$off('eventName');
總結(jié)
eventBus 適合小項(xiàng)目、數(shù)據(jù)被更少組件使用的項(xiàng)目,對(duì)于中大型項(xiàng)目數(shù)據(jù)在很多組件之間使用的情況 eventBus 就不太適用了。eventBus 其實(shí)就是一個(gè)發(fā)布訂閱模式,利用 Vue 的自定義事件機(jī)制,在觸發(fā)的地方通過(guò) $emit 向外發(fā)布一個(gè)事件,在需要監(jiān)聽(tīng)的頁(yè)面,通過(guò) $on 監(jiān)聽(tīng)事件。
相關(guān)文章
Vue3源碼通過(guò)render?patch?了解diff
這篇文章主要為大家介紹了Vue3源碼系列通過(guò)render及patch了解diff原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
解決VUE的對(duì)話框el-dialog點(diǎn)擊外部消失問(wèn)題
這篇文章主要介紹了解決VUE的對(duì)話框el-dialog點(diǎn)擊外部消失問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
vue3實(shí)現(xiàn)H5表單驗(yàn)證組件的示例
Vue3 axios配置以及cookie的使用方法實(shí)例演示
Vue組件實(shí)現(xiàn)評(píng)論區(qū)功能

