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

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

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

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

2.子組件與父組件通信

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

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

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

3.非父子組件通信

如果2個(gè)組件不是父子組件那么如何通信呢?這時(shí)可以通過(guò)eventHub來(lái)實(shí)現(xiàn)通信. 所謂eventHub就是創(chuàng)建一個(gè)事件中心,相當(dāng)于中轉(zhuǎn)站,可以用它來(lái)傳遞事件和接收事件.
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'; }); }
這樣就實(shí)現(xiàn)了非父子組件之間的通信了.原理就是把Hub當(dāng)作一個(gè)中轉(zhuǎn)站!
以下是詳細(xì)代碼
<meta charset="utf-8">

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

image

不過(guò)官網(wǎng)說(shuō)的太簡(jiǎn)單了,新手看完估計(jì)還是一臉懵逼。還有這個(gè)空的 Vue 實(shí)例放到哪里合適也值得商榷。

這篇文章的目的就是用一個(gè)簡(jiǎn)單的例子讓你明白如何用 Bus ?? 來(lái)進(jìn)行通信:

image

假設(shè) bb 組件里面有個(gè)按鈕,點(diǎn)擊按鈕,把 123 傳遞給 aa 組件

// 根組件(this.$root)

new Vue({
el: '#app',
 router,
 render: h => h(App),
 data: {
  // 空的實(shí)例放到根組件下,所有的子組件都能調(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)用事件接收↓

// 當(dāng)前實(shí)例創(chuàng)建完成就監(jiān)聽(tīng)這個(gè)事件

created(){

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

  this.print(value)

 })

},

methods: {

 print(value) {

  console.log(value)

 }

},

// 在組件銷(xiāo)毀時(shí)別忘了解除事件綁定

beforeDestroy() {

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

},

我自己的實(shí)踐:

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

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

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

2、這是一個(gè)彈出框組件,通過(guò)監(jiān)聽(tīng)輸入框組件的change事件傳過(guò)來(lái)的值來(lái)判斷是否彈出
image.png

***關(guān)鍵詞:通過(guò)$on接收事件

這樣就可以了,是不是很簡(jiǎn)單?

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

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

問(wèn)題二:為什么要弄個(gè) Bus?直接 this.root.on、this.root.emit 不更簡(jiǎn)單粗暴?

答:按照文檔上的說(shuō)法是專(zhuān)門(mén)用一個(gè)空的 Vue 實(shí)例(Bus)來(lái)做中央事件總線更加清晰也易于管理。

可以參考我最新的文章關(guān)于兄弟組件之間的通信:
http://www.lxweimin.com/p/3e7b62e0bbf7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

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