兄弟組件之間如何通訊

在工做中有些情景。兄弟之間的通訊,可能用vuex 並不方便,因此須要一箇中間介質傳遞一下。css

Vue 實例實現了一個事件分發接口.html

請直接看代碼,在初始化web app的時候,給data添加一個 名字爲eventhub 的空vue對象vue

new Vue({ el: '#app', router, render: h => h(App), data: { eventHub: new Vue() } })

好的 這個時候 你就能夠一勞永逸了,在任何組件均可以調用事件發射 接受的方法了.webpack

如何獲取到這個空的vue對象 eventhub呢.在組件裏面直接調用這個git

某一個組件內調用事件觸發github

//經過this.$root.eventHub獲取此對象 //調用$emit 方法 this.$root.eventHub.$emit('YOUR_EVENT_NAME', yourData)

另外一個組件內調用事件接受,固然在組件銷燬時接觸綁定,使用$off方法web

this.$root.eventHub.$on('YOUR_EVENT_NAME', (yourData)=>{ handle(yourData) } ) 

 

遇到一個問題 ,考慮特定場景:vuex

跳轉路由以前咱們調用了$emit方法,這個方法在A組件裏面處理數據,可是A組件綁定$on事件以前 $emit事件已經發射,因此這會致使一直接受不到消息,看來這個事件綁定有時效性問題,你能夠setTimeout來作一下延時,可是這個特別奇怪,那就把數據存到store而後等A組件加載完了再去取。。。。json

 

 

額外方法bash

1.在stackoverflow 發現一個更加簡潔的方法,由於本質上vue是一個js對象,咱們想保存一個全局對象,只須要在Vue的prototype上面增長一個屬性便可,本質上全部Vue組件都是繼承全局的Vue。只要在初始化Vue對象以前給原生Vue對象prototype增長屬性,那樣全部的組件(由於都是繼承自它的實例)均可以訪問到這個屬性。相關資料請參考我以前的文章關於函數的構造函數和prototype<四>

在初始化Web app 以前 加上這樣一句:

Vue.prototype.$eventHub= Vue.prototype.$eventHub || new Vue()

固然咱們能夠定義其餘的全局變量.好比當前app的系統配置文件,名字爲sysconfig.json,你能夠這樣定義

Vue.prototype.$config =Vue.prototype.$config||require('path/sysconfig.json')

這樣咱們在組件內部 就能夠直接調用$eventHub 和 $config對象了。 
好比 在mounted函數裏面直接 console.log($config.yourKey)

2.

剛纔看到了webpack的插件裏面有一個definePlugin 它能夠幫咱們定義全局的常量。

如何使用,很簡單可是更好,咱們不用去修改Vue對象:

new webpack.DefinePlugin({ CONFIG: require('path/sysconfig.json') });

而後咱們也能夠在全局內使用CONFIG對象了。

相關文章
相關標籤/搜索