vue父子組件通信(轉(zhuǎn)載)

組件是 vue.js 最強(qiáng)大的功能之一,而組件實(shí)例的作用域是相互獨(dú)立的,這就意味著不同組件之間的數(shù)據(jù)無(wú)法相互引用千扔。那么組件間如何通信逛揩,也就成為了vue中重點(diǎn)知識(shí)了。這篇文章將會(huì)通過(guò)props杖狼、ref和emit 這幾個(gè)知識(shí)點(diǎn),來(lái)講解如何實(shí)現(xiàn)父子組件間通信。

在說(shuō)如何實(shí)現(xiàn)通信之前耳峦,我們先來(lái)建兩個(gè)組件father.vue和child.vue作為示例的基礎(chǔ)。

//父組件

<template>
  <div>
    <h1>我是父組件焕毫!</h1>
    <child></child>
  </div>
</template>

<script>
import Child from '../components/child.vue'
export default {
  components: {Child},
}
</script>

//子組件

<template>
  <h3>我是子組件蹲坷!</h3>
</template>

<script>
</script>

這兩部分的代碼都很清晰明了驶乾,父組件通過(guò)import的方式導(dǎo)入子組件,并在components屬性中注冊(cè)循签,然后子組件就可以用標(biāo)簽<child>的形式嵌進(jìn)父組件了级乐。運(yùn)行father.vue后的效果是這樣的:

image

1.通過(guò)prop實(shí)現(xiàn)通信

子組件的props選項(xiàng)能夠接收來(lái)自父組件數(shù)據(jù)。沒(méi)錯(cuò)县匠,僅僅只能接收风科,props是單向綁定的,即只能父組件向子組件傳遞乞旦,不能反向贼穆。而傳遞的方式也分為兩種:

(1)靜態(tài)傳遞

子組件通過(guò)props選項(xiàng)來(lái)聲明一個(gè)自定義的屬性,然后父組件就可以在嵌套標(biāo)簽的時(shí)候兰粉,通過(guò)這個(gè)屬性往子組件傳遞數(shù)據(jù)了故痊。

 <!-- 父組件 -->

<template>
  <div>
    <h1>我是父組件!</h1>
    <child message="我是子組件一玖姑!"></child>  //通過(guò)自定義屬性傳遞數(shù)據(jù)
  </div>
</template>

<script>
import Child from '../components/child.vue'
export default {
  components: {Child},
}
</script>

 <!-- 子組件 -->

<template>
  <h3>{{message}}</h3>
</template>
<script>
  export default {
    props: ['message']   //聲明一個(gè)自定義的屬性
  }
</script>

(2)動(dòng)態(tài)傳遞

我們已經(jīng)知道了可以像上面那樣給 props 傳入一個(gè)靜態(tài)的值愕秫,但是我們更多的情況需要?jiǎng)討B(tài)的數(shù)據(jù)。這時(shí)候就可以用 v-bind 來(lái)實(shí)現(xiàn)焰络。通過(guò)v-bind綁定props的自定義的屬性戴甩,傳遞去過(guò)的就不是靜態(tài)的字符串了,它可以是一個(gè)表達(dá)式闪彼、布爾值甜孤、對(duì)象等等任何類(lèi)型的值。

 <!-- 父組件 -->

<template>
  <div>
    <h1>我是父組件备蚓!</h1>
    <child message="我是子組件一课蔬!"></child> 

    <!-- 這是一個(gè) JavaScript 表達(dá)式而不是一個(gè)字符串。-->
    <child v-bind:message="a+b"></child>

    <!-- 用一個(gè)變量進(jìn)行動(dòng)態(tài)賦值郊尝。-->
    <child v-bind:message="msg"></child>
  </div>
</template>

<script>
import Child from '../components/child.vue'
export default {
  components: {Child},
  data() {
    return {
      a:'我是子組件二二跋!',
      b:112233,
      msg: '我是子組件三!'+ Math.random()
    }
  }
}
</script>

 <!-- 子組件 -->

<template>
  <h3>{{message}}</h3>
</template>
<script>
  export default {
    props: ['message']
  }
</script>

出來(lái)的效果是這樣的:

image

2.通過(guò)$ref 實(shí)現(xiàn)通信

對(duì)于ref官方的解釋是:ref 是被用來(lái)給元素或子組件注冊(cè)引用信息的流昏。引用信息將會(huì)注冊(cè)在父組件的 $refs 對(duì)象上扎即。
看不懂對(duì)吧?很正常况凉,我也看不懂谚鄙。那應(yīng)該怎么理解?看看我的解釋?zhuān)?/p>

  • 如果ref用在子組件上刁绒,指向的是組件實(shí)例闷营,可以理解為對(duì)子組件的索引,通過(guò)$ref可能獲取到在子組件里定義的屬性和方法。
  • 如果ref在普通的 DOM 元素上使用傻盟,引用指向的就是 DOM 元素速蕊,通過(guò)$ref可能獲取到該DOM 的屬性集合,輕松訪(fǎng)問(wèn)到DOM元素娘赴,作用與JQ選擇器類(lèi)似规哲。

那如何通過(guò)ref 實(shí)現(xiàn)通信?下面我將上面prop實(shí)現(xiàn)的功能诽表,用ref實(shí)現(xiàn)一遍:

 <!-- 父組件 -->

<template>
  <div>
    <h1>我是父組件唉锌!</h1>
    <child ref="msg"></child>
  </div>
</template>

<script>
  import Child from '../components/child.vue'
  export default {
    components: {Child},
    mounted: function () {
      console.log( this.$refs.msg);
      this.$refs.msg.getMessage('我是子組件一!')
    }
  }
</script>

 <!-- 子組件 -->

<template>
  <h3>{{message}}</h3>
</template>
<script>
  export default {
    data(){
      return{
        message:''
      }
    },
    methods:{
      getMessage(m){
        this.message=m;
      }
    }
  }
</script>

從上面的代碼我們可以發(fā)現(xiàn)竿奏,通過(guò)ref=‘msg’可以將子組件child的實(shí)例指給ref袄简,并且通過(guò).msg.getMessage()調(diào)用到子組件的getMessage方法,將參數(shù)傳遞給子組件议双。下面是“ console.log( this.refs.msg);”打印出來(lái)的內(nèi)容痘番,這可以讓大家更加了解,究竟通過(guò)ref我們獲取了什么:

image

最后的效果是這樣的:

image
這里再補(bǔ)充一點(diǎn)就是平痰,prop和$ref之間的區(qū)別:
  • prop 著重于數(shù)據(jù)的傳遞,它并不能調(diào)用子組件里的屬性和方法伍纫。像創(chuàng)建文章組件時(shí)宗雇,自定義標(biāo)題和內(nèi)容這樣的使用場(chǎng)景,最適合使用prop莹规。
  • $ref 著重于索引赔蒲,主要用來(lái)調(diào)用子組件里的屬性和方法,其實(shí)并不擅長(zhǎng)數(shù)據(jù)傳遞良漱。而且ref用在dom元素的時(shí)候舞虱,能使到選擇器的作用,這個(gè)功能比作為索引更常有用到母市。

3.通過(guò)$emit 實(shí)現(xiàn)通信

上面兩種示例主要都是父組件向子組件通信矾兜,而通過(guò)emit 實(shí)現(xiàn)子組件向父組件通信。 對(duì)于emit官網(wǎng)上也是解釋得很朦朧患久,我按我自己的理解是這樣的:
vm.emit( event, arg )emit 綁定一個(gè)自定義事件event椅寺,當(dāng)這個(gè)這個(gè)語(yǔ)句被執(zhí)行到的時(shí)候,就會(huì)將參數(shù)arg傳遞給父組件蒋失,父組件通過(guò)@event監(jiān)聽(tīng)并接收參數(shù)返帕。

<template>
  <div>
    <h1>{{title}}</h1>
    <child @getMessage="showMsg"></child>
  </div>
</template>

<script>
  import Child from '../components/child.vue'
  export default {
    components: {Child},
    data(){
      return{
        title:''
      }
    },
    methods:{
      showMsg(title){
       this.title=title;
      }
  }
  }
</script>

<template>
  <h3>我是子組件!</h3>
</template>
<script>
  export default {
    mounted: function () {
      this.$emit('getMessage', '我是父組件篙挽!')
    }
  }
</script>

image

作者:四小七
鏈接:http://www.reibang.com/p/91416e11f012
來(lái)源:簡(jiǎn)書(shū)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荆萤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子铣卡,更是在濱河造成了極大的恐慌链韭,老刑警劉巖邑闲,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異梧油,居然都是意外死亡苫耸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)儡陨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)褪子,“玉大人,你說(shuō)我怎么就攤上這事骗村∠油剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵胚股,是天一觀(guān)的道長(zhǎng)笼痛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)琅拌,這世上最難降的妖魔是什么缨伊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮进宝,結(jié)果婚禮上刻坊,老公的妹妹穿的比我還像新娘。我一直安慰自己党晋,他們只是感情好谭胚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著未玻,像睡著了一般灾而。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扳剿,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天旁趟,我揣著相機(jī)與錄音,去河邊找鬼舞终。 笑死轻庆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敛劝。 我是一名探鬼主播余爆,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夸盟!你這毒婦竟也來(lái)了蛾方?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桩砰,沒(méi)想到半個(gè)月后拓春,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亚隅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年硼莽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煮纵。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懂鸵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出行疏,到底是詐尸還是另有隱情匆光,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布酿联,位于F島的核電站终息,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贞让。R本人自食惡果不足惜周崭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望震桶。 院中可真熱鬧休傍,春花似錦、人聲如沸蹲姐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柴墩。三九已至,卻和暖如春凫岖,著一層夾襖步出監(jiān)牢的瞬間江咳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工哥放, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歼指,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓甥雕,卻偏偏與公主長(zhǎng)得像踩身,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子社露,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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