前言:html
若是想要了解非父子關係的組件傳值,最好是在瞭解父傳子和子傳父的基礎上在來了解非父子傳值可能會有更透徹的思路。vue
由於非父子傳值是經過定義事件總線來代理實現父傳子+子傳父從而實現的傳值方式。函數
這是我總結的父子傳值相關的知識,可供參考: http://www.javashuo.com/article/p-umgtwkqr-dy.htmlspa
而後大概回顧一下父子傳值的過程:代理
根據上述信息可知,若是兩個組件須要傳遞值那麼須要這兩個組件之間是父子關係才能傳遞數據。code
那麼若是有這樣一個組件,既能夠幫你傳遞數據,又能夠幫你接收數據該多好啊?htm
因而乎,一個叫事件總線的概念出現了,它就能夠幫助實現你想要的這些功能。對象
瞭解事件總線以前,須要先看下兩個重要的方法。blog
前置知識: 事件
1. $emit(event, data)方法
event: 觸發的事件類型
data: 觸發這個事件時傳遞的參數
2. $on(event, callBack(data))方法
event: 綁定的事件類型
callBack: 綁定的這個事件所對應的回調函數,其默認的第一個參數data是使用$emit觸發這個事件時所傳遞的參數
在瞭解了這兩個方法後,再來看下面的這張圖:
若是仍是不太明白,那就轉換成代碼在分析一下:
首先,定義一個eventBus:
// eventBus.js // 事件總線: 只須要導出一個Vue實例便可 import Vue from 'vue' export default new Vue()
而後,在A組件中導入eventBus, 並觸發自定義的AtoB事件
// A.vue
// 導入eventBus import eventBus from "./eventBus" // 觸發事件並傳遞參數 eventBus.$emit("AtoB", "Data_A")
最後,在B組件中導入eventBus,並監聽自定義的AtoB事件
// B.vue
// 導入eventBus import eventBus from "./eventBus" // 觸發事件並傳遞參數 eventBus.$on("AtoB", data =>{ console.log(data); // "Data_A" })
總結:
原文出處:https://www.cnblogs.com/ViavaCos/p/11986576.html