Vue是一款輕量級的前端框架,被廣泛應(yīng)用于構(gòu)建單頁應(yīng)用。但是,某些情況下,在不同Vue組件之間傳遞數(shù)據(jù)并保持同步,可以使用Vue Bus這樣的全局事件總線來實(shí)現(xiàn)。Vue Bus是Vue.js中分離組件之間通信的插件。
當(dāng)我們需要在一個組件中發(fā)送一個事件,并在其他組件中接收該事件,Vue Bus就可以被用來簡化這個過程。Vue Bus具有以下優(yōu)點(diǎn):
- 封裝了事件觸發(fā)和事件監(jiān)聽邏輯,提供了更高的流程抽象
- 好維護(hù),即使組件層級再多,也不需要修改父層組件,不改變數(shù)據(jù)結(jié)構(gòu)與組件機(jī)構(gòu)
- 對于多個組件之間的通信,Vue Bus具有可擴(kuò)展性并易于管理數(shù)據(jù)流
const Bus = new Vue(); // 發(fā)送事件 Bus.$emit('my-event', data); // 接收事件 Bus.$on('my-event', (data) =>{ // 處理數(shù)據(jù) })
在上面的代碼中,我們可以看到Vue Bus的兩個方法,分別是$emit()用于發(fā)送事件,和$on()用于接收事件。首先,我們在一個組件中用$emit()發(fā)送事件,事件的名字和數(shù)據(jù)則作為$emit()方法的參數(shù)。接著,在另一個組件中使用$on()方法,給其傳遞相同事件名的參數(shù)和一個處理函數(shù),當(dāng)該方法被觸發(fā)時,該組件就會執(zhí)行該方法并執(zhí)行相應(yīng)的數(shù)據(jù)處理操作。
下面是一個使用Vue Bus進(jìn)行組件間通信的示例:
// 創(chuàng)建和導(dǎo)出事件總線 export const EventBus = new Vue(); // 子組件1 import { EventBus } from '../event-bus.js'; export default { methods: { updateData() { EventBus.$emit('data-updated', this.data) } } } //子組件2 import { EventBus } from '../event-bus.js'; export default { data() { return { updatedData: '' }; }, created() { EventBus.$on('data-updated', data =>{ this.updatedData = data; }) } }在上面這個例子中,我們首先導(dǎo)出一個事件總線實(shí)例,并在組件1中使用$emit()方法向總線上發(fā)送事件'data-updated',并把組件中的數(shù)據(jù)存儲在事件的數(shù)據(jù)字段中。組件2偵聽事件'data-updated',并在接收該事件時獲取到同樣的數(shù)據(jù)并對其進(jìn)行處理。