vue2.0父子組件以及非父子組件通信傳參詳解

寫在前面


之前每次寫項(xiàng)目的時(shí)候老是忘記vue的組件之間的傳參,很不方便褪测,每次都是現(xiàn)查喝滞,趁著這次折騰非父子組件的傳參,學(xué)習(xí)記錄下來膏秫,以方便以后學(xué)習(xí)使用右遭。

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

父組件寫法

<parent>
    <child :child-msg="msg"></child>//這里必須要用 - 代替駝峰
</parent>

data(){
    return {
        msg: [1,2,3]
    };
}

子組件接收寫法

第一種:
props: ['childMsg']
第二種:
props: {
    childMsg: Array //這樣可以指定傳入的類型,如果類型不對缤削,會(huì)警告
}
第三種:
props: {
    childMsg: {
        type: Array,
        default: [0,0,0] //這樣可以指定默認(rèn)的值
    }
}
可以根據(jù)自己的需要選擇使用哪一種

2.子組件與父組件通信

vue文檔中是這么解釋的:如果子組件想要改變數(shù)據(jù)呢窘哈?這在vue中是不允許的,因?yàn)関ue只允許單向數(shù)據(jù)傳遞亭敢,這時(shí)候我們可以通過觸發(fā)事件來通知父組件改變數(shù)據(jù)滚婉,從而達(dá)到改變子組件數(shù)據(jù)的目的.


子組件寫法

<template>
    <div @click="up"></div>
</template>

methods: {
    up() {
        this.$emit('upup','hehe'); //主動(dòng)(dispatch)觸發(fā)upup方法,'hehe'為向父組件傳遞的數(shù)據(jù)
    }
}

父組件寫法

<div>
    <child @upup="change" :msg="msg"></child> //監(jiān)聽子組件觸發(fā)的upup事件,然后調(diào)用change方法
</div>
methods: {
    change(msg) {
        this.msg = msg;
    }
}

3.非父子組件通信

vue文檔中是這么解釋的:如果2個(gè)組件不是父子組件那么如何通信呢帅刀?這時(shí)可以通過eventHub來實(shí)現(xiàn)通信.
所謂eventHub就是創(chuàng)建一個(gè)事件中心让腹,相當(dāng)于中轉(zhuǎn)站,可以用它來傳遞事件和接收事件.

第一種:

創(chuàng)建一個(gè)公共的js扣溺,美其名曰:bus.js作為中間倉庫來傳值骇窍。
//bus.js
import Vue from 'vue'
export default new Vue()

組件A中

<template>
  <div>
    A組件:
      '$emit' 官網(wǎng)解釋:  ---事件觸發(fā)器
    <span>{{elementValue}}</span>
    <input type="button" value="點(diǎn)擊觸發(fā)" @click="elementByValue">
  </div>
</template>
<script>
  // 引入公共的bus,來做為中間傳達(dá)的工具
  import Bus from './bus.js'
  export default {
    data () {
      return {
        elementValue: 4
      }
    },
    methods: {
      elementByValue: function () {
       通過事件中心去發(fā)射'Assembly'自己命名的锥余,方法腹纳,this.elementValue為傳的參數(shù)。
        Bus.$emit('Assembly', this.elementValue)
      }
    }
  }
</script>

組件B中

<template>
  <div>
    B組件:  
   通過$on方法來接受該方法以及傳的參數(shù)
    <input type="button" value="點(diǎn)擊觸發(fā)" @click="getData">
    <span>{{name}}</span>
  </div>
</template>
<script>
  import Bus from './bus.js'
  export default {
    data () {
      return {
        name: 0
      }
    },
    mounted: function () {
      var vm = this
      // 用$on事件來接收參數(shù)   并且調(diào)用了在a組件中出發(fā)的方法
      Bus.$on('Assembly', (data) => {
        console.log(data)
        vm.name = data
      })
    },
    methods: {
      getData: function () {
        this.name++
      }
    }
  }
</script>

這就完成了非父子組件的傳參驱犹,不過小編在學(xué)習(xí)過程中還發(fā)現(xiàn)了另一種方法:真是學(xué)自折騰來啊

不理解的小伙伴可以參考官網(wǎng)的解釋:

微信圖片_20180920204827.png

第二種:說明一下

由于vue2.0 移除了1.0中的dispatch 和broadcast 這兩個(gè)組件之間通信傳遞數(shù)據(jù)的方法 ,官方的給出的最簡單的升級(jí)建議是使用集中的事件處理器,

而且也明確說明了 一個(gè)空的vue實(shí)例就可以做到,因?yàn)閂ue 實(shí)例實(shí)現(xiàn)了一個(gè)事件分發(fā)接口.方法就是嘲恍,在vue初始化的時(shí)候給data添加一個(gè) 名字為eventhub 的空vue對象


main.js中

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

好的 這個(gè)時(shí)候 你就可以一勞永逸了,在任何組件都可以調(diào)用事件發(fā)射 接受的方法了.
如何獲取到這個(gè)空的vue對象 eventhub呢.在組件里面直接調(diào)用這個(gè)

某一個(gè)組件內(nèi)調(diào)用事件觸發(fā)
//通過this.$root.eventHub獲取此對象
//調(diào)用$emit 方法
this.$root.eventHub.$emit('YOUR_EVENT_NAME', yourData)
另一個(gè)組件內(nèi)調(diào)用事件接受,當(dāng)然在組件銷毀時(shí)接觸綁定,使用$off方法
mounted(){
this.$root.eventHub.$on('YOUR_EVENT_NAME', (yourData)=>{
    console.log(yourData)
})
}

結(jié)束語

總結(jié)一下雄驹,收獲還是蠻大的佃牛,但是不知道是記性不好了,還是老了医舆,寫一段時(shí)間的別的項(xiàng)目就忘掉了吁脱,還是需要重新溫習(xí)一遍,真是應(yīng)了那句古話彬向,好記性不如爛筆頭兼贡。好了不多說了,希望可以幫助到自己和小伙伴們娃胆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遍希,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子里烦,更是在濱河造成了極大的恐慌凿蒜,老刑警劉巖禁谦,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異废封,居然都是意外死亡州泊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門漂洋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遥皂,“玉大人,你說我怎么就攤上這事刽漂⊙菅担” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵贝咙,是天一觀的道長样悟。 經(jīng)常有香客問我,道長庭猩,這世上最難降的妖魔是什么窟她? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蔼水,結(jié)果婚禮上礁苗,老公的妹妹穿的比我還像新娘。我一直安慰自己徙缴,他們只是感情好试伙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著于样,像睡著了一般疏叨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上穿剖,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天蚤蔓,我揣著相機(jī)與錄音,去河邊找鬼糊余。 笑死秀又,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贬芥。 我是一名探鬼主播吐辙,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蘸劈!你這毒婦竟也來了昏苏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贤惯,沒想到半個(gè)月后洼专,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孵构,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年屁商,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颈墅。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜡镶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出精盅,到底是詐尸還是另有隱情,我是刑警寧澤谜酒,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布叹俏,位于F島的核電站,受9級(jí)特大地震影響僻族,放射性物質(zhì)發(fā)生泄漏粘驰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一述么、第九天 我趴在偏房一處隱蔽的房頂上張望蝌数。 院中可真熱鬧,春花似錦度秘、人聲如沸顶伞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唆貌。三九已至,卻和暖如春垢乙,著一層夾襖步出監(jiān)牢的瞬間锨咙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工追逮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酪刀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓钮孵,卻偏偏與公主長得像骂倘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子巴席,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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