最詳細的vue的父子組件以及非父子組件之間的通信方式

1.父組件傳遞數(shù)據(jù)給子組件

父組件數(shù)據(jù)如何傳遞給子組件呢?可以通過props屬性來實現(xiàn)
父組件:
//這里必須要用 - 代替駝峰
data(){ return { msg: [1,2,3] }; }
子組件通過props來接收數(shù)據(jù): 方式1:
props: ['childMsg']
方式2 :
props: { childMsg: Array //這樣可以指定傳入的類型,如果類型不對,會警告 }
方式3:
props: { childMsg: { type: Array, default: [0,0,0] //這樣可以指定默認的值 } }
這樣呢,就實現(xiàn)了父組件向子組件傳遞數(shù)據(jù).

【案例演示1】
父組件里面的內(nèi)容
image.png
子組件里面的內(nèi)容
image.png
注意:這里的第一個父組件傳值給子組件分為傳引用和傳值兩種方式,傳引用的時候改變引用關系,則子組件的也會變化(改變父組件中數(shù)組的引用時可以看到子組件的props數(shù)組隨之改變,而子組件中綁定的數(shù)組確并沒有隨之改變)傳值則不會

2.子組件與父組件通信

那么,如果子組件想要改變數(shù)據(jù)呢?這在vue中是不允許的,因為vue只允許單向數(shù)據(jù)傳遞,這時候我們可以通過觸發(fā)事件來通知父組件改變數(shù)據(jù),從而達到改變子組件數(shù)據(jù)的目的.
子組件: <div @click="up">
methods: { up() { this.$emit('upup','hehe'); //主動觸發(fā)upup方法,'hehe'為向父組件傳遞的數(shù)據(jù) } }
父組件:
//監(jiān)聽子組件觸發(fā)的upup事件,然后調(diào)用change方法
methods: { change(msg) { this.msg = msg; } }

【案例演示2】
父組件里面的內(nèi)容
image.png
子組件里面的內(nèi)容
image.png

注意:簡而言之就是先子組件定義一個事件,然后通過$emit方式
傳遞過去一個事件名稱,,父組件首先在html上用@事件名######="子組件自定義事件名"來接受,最后就是調(diào)用父組件剛剛定義的######事件,傳入一個參數(shù),就可以接收來自子組件的事件觸發(fā)及其參######數(shù)傳遞。
大家可以參考這篇文章https://www.cnblogs.com/LoveAndPeace/p/7273648.html

3.非父子組件通信

如果2個組件不是父子組件那么如何通信呢?這時可以通過eventHub來實現(xiàn)通信. 所謂eventHub就是創(chuàng)建一個事件中心,相當于中轉(zhuǎn)站,可以用它來傳遞事件和接收事件.
let Hub = new Vue(); //創(chuàng)建事件中心
組件1觸發(fā):
methods: { eve() { Hub.emit('change','hehe'); //Hub觸發(fā)事件 } } 組件2接收: created() { Hub.on('change', () => { //Hub接收事件 this.msg = 'hehe'; }); }
這樣就實現(xiàn)了非父子組件之間的通信了.原理就是把Hub當作一個中轉(zhuǎn)站!
以下是詳細代碼
<meta charset="utf-8">

Vue 官網(wǎng)介紹了非父子組件通信方法:

image

不過官網(wǎng)說的太簡單了,新手看完估計還是一臉懵逼。還有這個空的 Vue 實例放到哪里合適也值得商榷。

這篇文章的目的就是用一個簡單的例子讓你明白如何用 Bus ?? 來進行通信:

image

假設 bb 組件里面有個按鈕,點擊按鈕,把 123 傳遞給 aa 組件

// 根組件(this.$root)

new Vue({
el: '#app',
 router,
 render: h => h(App),
 data: {
  // 空的實例放到根組件下,所有的子組件都能調(diào)用
Bus: new Vue()
}
})

bb 組件內(nèi)調(diào)用事件觸發(fā)↓

<button @click="submit">提交<button>

methods: {

  submit() {

   // 事件名字自定義,用不同的名字區(qū)別事件

   this.$root.$emit('eventName', 123)

  }

 }

aa 組件內(nèi)調(diào)用事件接收↓

// 當前實例創(chuàng)建完成就監(jiān)聽這個事件

created(){

 this.$root.$on('eventName', value => {

  this.print(value)

 })

},

methods: {

 print(value) {

  console.log(value)

 }

},

// 在組件銷毀時別忘了解除事件綁定

beforeDestroy() {

  this.$root.Bus.$off('eventName')

},

我自己的實踐:

1、這是父組件app.vue,分別有兩個子組件input和dialog

注意:這里一定要引入vue不然會報錯
image.png
1、這是一個輸入框組件,通過輸入觸發(fā)change事件,給彈出框組件傳值
image.png
image.png

***關鍵詞:通過$emit觸發(fā)事件

2、這是一個彈出框組件,通過監(jiān)聽輸入框組件的change事件傳過來的值來判斷是否彈出
image.png

***關鍵詞:通過$on接收事件

這樣就可以了,是不是很簡單?

問題一:如果有多個組件組件需要通信,是不是要在根組件上多建幾個 Bus?

答:不需要的,只要保證事件名 (eventName)不一樣就行了。

問題二:為什么要弄個 Bus?直接 this.root.on、this.root.emit 不更簡單粗暴?

答:按照文檔上的說法是專門用一個空的 Vue 實例(Bus)來做中央事件總線更加清晰也易于管理。

可以參考我最新的文章關于兄弟組件之間的通信:
http://m.itdecent.cn/p/3e7b62e0bbf7

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容。關于...
    云之外閱讀 5,186評論 0 29
  • Android之ActivityManagerService淺談 一、在本文中需要提前了解的知識: 1)AMS —...
    遠遠飄著云閱讀 2,148評論 0 3
  • 什么是vuex? Vuex 是一個專為Vue.js用程序開發(fā)的狀態(tài)管理模式。 狀態(tài)管理模式中的狀態(tài)是指什么狀態(tài)?為...
    小熊530閱讀 180評論 0 0
  • 大家好,我是IT修真院北京分院web第31期學員金立劍 【js-6】DOM有哪些操作 1.背景介紹 什么是DOM?...
    bqzhzqay閱讀 420評論 1 1
  • 股市有風險,投資需謹慎! 早就對股市垂涎已久了,天天聽李先生在耳朵邊分析股市行情,聽得心癢癢,但是又怕怕的。 說來...
    小迷糊Lyla閱讀 185評論 0 2

友情鏈接更多精彩內(nèi)容