Vue提供了一種非常方便的方式在組件之間進(jìn)行通信,那就是EventBus。EventBus是一個(gè)發(fā)布/訂閱模式的實(shí)現(xiàn),允許任何組件訂閱特定的事件和發(fā)布(觸發(fā))事件,從而實(shí)現(xiàn)組件之間的解耦。
EventBus實(shí)際上就是一個(gè)Vue實(shí)例,任何組件都可以通過(guò)這個(gè)實(shí)例來(lái)訂閱和發(fā)布事件。在Vue中使用EventBus有如下簡(jiǎn)單的步驟:
// 在 main.js 中創(chuàng)建 EventBus 實(shí)例 Vue.prototype.$bus = new Vue() // 在組件中訂閱事件 this.$bus.$on('myEvent', () =>{ console.log('myEvent triggered') }) // 在組件中發(fā)布事件 this.$bus.$emit('myEvent')
以上代碼中,我們首先在main.js中創(chuàng)建了一個(gè)EventBus實(shí)例,并掛載到Vue的原型上。這樣,在任何組件中都可以通過(guò)this.$bus來(lái)訪問(wèn)這個(gè)實(shí)例,從而訂閱和發(fā)布事件。
訂閱事件的方法是$on(event, callback),其中event是事件名,callback是回調(diào)函數(shù)。當(dāng)EventBus實(shí)例觸發(fā)該事件時(shí),所有訂閱該事件的回調(diào)函數(shù)都將被調(diào)用。例如我們上面代碼中的this.$bus.$on('myEvent', ()=>{...})語(yǔ)句表示訂閱了名為'myEvent'的事件,當(dāng)名為'myEvent'的事件被觸發(fā)時(shí),控制臺(tái)將輸出'myEvent triggered'。
發(fā)布事件的方法是$emit(event, data),其中event是事件名,data是發(fā)送給訂閱者的數(shù)據(jù)。當(dāng)EventBus實(shí)例觸發(fā)該事件時(shí),所有訂閱該事件的回調(diào)函數(shù)將被調(diào)用,并且訂閱者將接收到相應(yīng)的數(shù)據(jù)。
總之,EventBus是Vue中非常方便的一種組件通信方式,可以幫助我們輕松實(shí)現(xiàn)組件之間的耦合解除。不過(guò),任何事件的發(fā)布都應(yīng)該在正確的時(shí)機(jī)進(jìn)行,以免出現(xiàn)邏輯問(wèn)題,特別是在多個(gè)組件訂閱同一個(gè)事件時(shí)更需要注意。