相信使用vue.js的開發(fā)者都知道eventbus的存在。它是vue.js提供的事件處理機制,可以讓不同組件之間進行通信。
首先,我們需要先引入eventbus。在main.js中創(chuàng)建一個Vue實例作為eventbus。
import Vue from 'vue' export const bus = new Vue()
接下來,在需要通信的組件中,用$emit方法觸發(fā)事件,用$on方法監(jiān)聽事件。下面是一個例子:
// 發(fā)送方組件 import { bus } from '@/main' export default { methods: { sendMsg () { bus.$emit('sendMsg', 'Hello, EventBus!') } } } // 接收方組件 import { bus } from '@/main' export default { data () { return { msg: '' } }, mounted () { bus.$on('sendMsg', (msg) =>{ this.msg = msg }) } }
在發(fā)送方組件中,我們定義了一個sendMsg方法,用$emit方法觸發(fā)sendMsg事件,并傳遞了一個字符串參數(shù)。在接收方組件中,我們用$on方法監(jiān)聽sendMsg事件,并把傳遞的參數(shù)賦值給data中的msg。
除了基本的事件監(jiān)聽和觸發(fā),eventbus還支持命名空間。如果有多個組件發(fā)送相同的事件,但需要在不同的組件中進行處理,可以用命名空間來區(qū)分。下面是一個命名空間的例子:
// 命名空間為NS1的組件1 import { bus } from '@/main' export default { methods: { sendMsg () { bus.$emit('NS1/sendMsg', 'Hello, EventBus!') } } } // 命名空間為NS2的組件2 import { bus } from '@/main' export default { data () { return { msg: '' } }, mounted () { bus.$on('NS1/sendMsg', (msg) =>{ this.msg = msg }) } }
在發(fā)送方組件中,我們在事件名前加上了命名空間“NS1/”,表示這個事件歸屬于NS1命名空間。在接收方組件中,我們用“NS1/sendMsg”作為事件名來監(jiān)聽NS1命名空間下的sendMsg事件。
通過使用eventbus,組件之間的通信變得方便簡單。但是過度使用eventbus可能會導致代碼可讀性降低和調(diào)試困難,要謹慎使用。