Vue組件之事件總線和消息發(fā)布訂閱詳解
簡(jiǎn)介
主要介紹事件總線的定義和編寫(xiě)方法和Vue是如何實(shí)現(xiàn)消息的訂閱與發(fā)布的。
事件總線
事件總線是組件間通信的一種方式,適用于任意組件間的通信,比如毫不相干的兩個(gè)組件、父子組件間、后代組件等等,都能通信。
事件總線有兩個(gè)特性:
- 是一個(gè)vue組件實(shí)例或者一個(gè)vue實(shí)例,充當(dāng)一個(gè)消息中轉(zhuǎn)站,如果A、B組件想要通信,那么A組件存消息到中轉(zhuǎn)站,B消息拿,或者反過(guò)來(lái)。
- 所有組件都要能獲取到事件總線。
如果A、B組件間通信,如果A發(fā)送數(shù)據(jù)給B的情況下,需要以下步驟:
大前提是,需要?jiǎng)?chuàng)建一個(gè)事件總線,通常使用vm實(shí)例本身作為事件總線,并把他在一定的時(shí)機(jī)保存在Vue構(gòu)造函數(shù)的原型對(duì)象中,因?yàn)榻M件實(shí)例的原型對(duì)象的原型對(duì)象=vue實(shí)例的原型對(duì)象,所以這樣所有的組件實(shí)例都是獲取到事件總線。
1.B(接收方)需要往事件總線總綁定一個(gè)自定義事件,并設(shè)置事件回調(diào)。
2.A(發(fā)送方)想要發(fā)送數(shù)據(jù)時(shí),只需觸發(fā)B在事件總線綁定的自定義事件,并把數(shù)據(jù)傳過(guò)去即可。

main.js:
//引入vue依賴(lài)
import Vue from 'vue'
//引入組件App
import App from './App.vue'
// 關(guān)閉生產(chǎn)提示
Vue.config.productionTip = false
//創(chuàng)建一個(gè)vue實(shí)例
new Vue({
render: h => h(App),
beforeCreate(){
//通常在beforeCreate生命周期函數(shù)中進(jìn)行事件總線的設(shè)置。
//下面代碼就是把vm對(duì)象本身設(shè)置到Vue的原型對(duì)象中,屬性名通常是$bus,這個(gè)不強(qiáng)制
Vue.prototype.$bus = this;
}
//配置該vue實(shí)例管理id為app的容器
}).$mount('#app')

App.vue:
<template>
<!-- 編寫(xiě)結(jié)構(gòu) -->
<div>
<A></A>
<hr>
<B></B>
</div>
</template>
<script>
//修改后的
//引入A組件和B組件,涉及es模塊化的語(yǔ)法
import A from "./components/A.vue"
import B from "./components/B.vue"
export default {
components:{
//注冊(cè)組件
A,
B
}
}
</script>
<style>
</style>
B.vue:
<template>
<div>
<div>B組件的名稱(chēng):{{name}}</div>
<div>A組件的名稱(chēng):{{NameForA}}</div>
</div>
</template>
<script>
export default {
data() {
return {
name:"yehaocong",
NameForA:""
}
},
methods:{
//觸發(fā)事件時(shí)的回調(diào)函數(shù)
getNameFromA(nameFromAVC){
console.log("接收來(lái)自A組件的名稱(chēng):",nameFromAVC);
this.NameForA = nameFromAVC;
}
},
mounted() {
//往事件總線總綁定自定義事件。
this.$bus.$on("getNameFromA",this.getNameFromA);
},
beforeDestroy() {
//通常在組件銷(xiāo)毀時(shí),需要解綁自定義事件。
this.$bus.$off("getNameFromA")
},
}
</script>
<style>
</style>

A.vue:
<template>
<div>
<div>{{name}}</div>
<button @click="sendName">發(fā)送name屬性值到其他組件</button>
</div>
</template>
<script>
export default {
data() {
return {
name:"liaoxianyan"
}
},
methods: {
sendName(){
//發(fā)送方觸發(fā)事件
this.$bus.$emit("getNameFromA",this.name);
}
},
}
</script>
<style>
</style>

效果:


通常最好需要在組件銷(xiāo)毀時(shí)解綁自定義事件:

消息的發(fā)布訂閱
訂閱與發(fā)布的定義:
1.是一種組件間通信的一種方式。
類(lèi)似有一個(gè)消息中心,組件A往該消息中心中訂閱了某消息,然后一旦消息組件B往該消息中發(fā)布該消息,組件A會(huì)立馬收到該消息,并執(zhí)行相應(yīng)回調(diào)。
通常使用第三方的消息訂閱發(fā)布庫(kù),這里推薦pubsub-js。
第一步:安裝該依賴(lài):npm i pubsub-js

第二步:在消息接收方進(jìn)行訂閱消息。
第三步:在消息發(fā)送方進(jìn)行消息的發(fā)布。
還是用上面的A、B組件作為例子,A組件時(shí)發(fā)送方,B組件時(shí)接收方。
第二步:
在B組件定義消息:

第三步:在A組件發(fā)布消息:

效果:


通常需要在組件銷(xiāo)毀時(shí)進(jìn)行消息的取消訂閱。

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
vue+springmvc導(dǎo)出excel數(shù)據(jù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue+springmvc導(dǎo)出excel數(shù)據(jù)的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
vue.js打包項(xiàng)目后頁(yè)面出現(xiàn)空白的解決辦法
這篇文章主要介紹了vue.js打包項(xiàng)目后頁(yè)面出現(xiàn)空白的解決辦法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-11-11
vue實(shí)現(xiàn)經(jīng)典選項(xiàng)卡功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)經(jīng)典選項(xiàng)卡功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
elementui中el-row的el-col排列混亂問(wèn)題及解決
這篇文章主要介紹了elementui中el-row的el-col排列混亂問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
vue使用websocket實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)推送功能
這篇文章主要為大家詳細(xì)介紹了vue如何使用websocket實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)推送,發(fā)布訂閱重連單點(diǎn)登錄功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
Vue跨域請(qǐng)求問(wèn)題解決方案過(guò)程解析
這篇文章主要介紹了Vue跨域請(qǐng)求問(wèn)題解決方案過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Vue項(xiàng)目中引入字體文件的幾種方法總結(jié)
在 Vue 項(xiàng)目中引入自定義字體文件,可以通過(guò)多種方式實(shí)現(xiàn),這取決于你的項(xiàng)目結(jié)構(gòu)、構(gòu)建工具以及字體文件的來(lái)源,本文將詳細(xì)介紹如何通過(guò)不同方法引入本地字體文件以及從外部引入字體,需要的朋友可以參考下2024-10-10

