用vue EventBus來進行組件溝通吧!

Joe Chang
Coding Hot Pot
Published in
Jun 15, 2020

在vue組件中想必大家已經很習慣用props、emit 來進行組件之間的溝通, 但遇到層級比較深的狀況就會比較困擾,用家族關係來比喻,如果想要傳遞訊息給某個表妹的話,要先傳給父親再傳給阿嬤,阿嬤再傳給姑姑,姑姑再傳給表妹,光聽就累了…有沒有什麼方法可以繞過這些重重關卡直接溝通?就可以利用vue的EventBus來達成。

範例的結構如下圖,為index內各有兩個子component,並且各自擁有自己的子component,利用eventBus來實作memberCenterItem與customerServiceItem的組件溝通。

這是index.vue的結構

起手式在src資料夾底下新增bus.js(名稱隨意,能夠識別功能即可),在vue的原型上掛載一個vue實例

記得要在main.js引用bus.js

在memberCenterItem component裡點擊標題會發送事件,寫法跟原本的 $emit幾乎一模一樣

this.$bus.$emit('事件',data) //如一般$emit一樣 可夾帶data

在customerServiceItem component created時註冊監聽事件,並且可以拿到另一邊送過來的資料

this.$bus.on('事件',獲取資料後要做的callback)

備註:避免重複監聽的問題,在組件銷毀之前記得取消監聽

this.$bus.$off('事件')

可以看到組件溝通成功!

假設不想額外寫一支js ,也可以直接在main.js,在vue的原型上註冊一個vue實例

也可以做到一樣的功能

不過我天真的以為監聽事件組件在沒被渲染的情況下,也可以觸發監聽事件,(如同下面的情形)實際測試沒被渲染的組件根本不會經過created階段啊..無法綁定監聽事,自然會溝通失敗。

--

--

Joe Chang
Coding Hot Pot

前端工程師,唯有非常努力,才能看起來毫不費力