vue2中常見的組件通信方法

1,父傳子:自定義事件配合props

父組件
<template>
  <div class="element">
    <h3>父組件</h3>
    <!-- 父組件向子組件傳值通過自定事件 -->
    <son-com :abc="pimsg"></son-com>
  </div>
</template>

<script>
//導入子組件
import sonCom from '@/components/SonCom.vue'
export default {
  components: {
    sonCom
  },
  data () {
    return {
      pimsg: '我是父組件的值'
    }
  }
}
</script>
//子組件
<template>
  <div class="">
    <h4>子組件</h4>
    <p>父組件傳過來的值:{{abc}}</p>
  </div>
</template>

<script>
export default {
  // 父組件傳過來的值通過props接收,子組件便可以使用
  props: ['abc']
}
</script>

2,子傳父 自定義事件配合 $emit

//子組件
<template>
  <div class="">
    <h4>子組件</h4>
    //子組件要向父組件傳遞值的按鈕
    <input type="button" value="子組件傳值" @click="sonbtn">
  </div>
</template>

<script>
export default {
  data () {
    return {
      sondata: '我是子組件的值'
    }
  },
  methods: {
    sonbtn () {
      // 子傳父,需要通過自定義事件來實現(xiàn)
      // 1. 注冊自定義事件 -- 注意 自定義事件名不要使用駝峰命名法!
      this.$emit('son-btn', { sondata: this.sondata })
    }
  },
}
</script>
//父組件
<template>
  <div class="element">
    <h3>父組件</h3>
    <!-- son-btn是子組件注冊的自定事件,里面攜帶著要傳遞的參數(shù) -->
    <son-com @son-btn="sonbtns($event)"></son-com>
  </div>
</template>

<script>
import sonCom from '@/components/SonCom.vue'
export default {
  components: {
    sonCom
  },
  data () {
    return {
      pimsg: '我是父組件的值'
    }
  },
  methods: {
    sonbtns (val) {
    // val===> { "sondata": "我是子組件的值" }
      this.pimsg = val.sondata
    }
  }
}
</script>

3姻政,兄弟組件之間的傳遞 -eventBus事件總線

新建一個.js的文件作為中間件
作為事件中心管理組件之間的通信

import Vue from 'vue'
// 定義一個新的vue實例作為事件中心,利用它來監(jiān)聽本身的自定義事件
const tmpCom = new Vue()
export default tmpCom
//兄弟組件之====>大兄弟
<template>
  <div class="">
    <h4>第一個兄第組件</h4>
    <input type="button" value="我是大兄弟" @click="maxbrother">
  </div>
</template>

<script>
 //引入中間件
import tmpCom from '@/router/middleware'
export default {
  data () {
    return {
      brotherdata: '我是大兄弟'
    }
  },
  methods: {
    maxbrother () {
       // 觸發(fā)事件中心的max-brother事件 
      tmpCom.$emit('max-brother', this.brotherdata)
      console.log(this.brotherdata)
    }
  },
  created () {}
}
</script>
//兄弟組件之====>小兄弟
<template>
  <div class="">
    <h4>第二個兄第組件</h4>
    <p>{{brother}}</p>
  </div>
</template>

<script>
//引入中間件
import tmpCom from '@/router/middleware'
export default {
  data () {
    return {
      brother: '我是小兄弟'
    }
  },
  mounted () {
      // 監(jiān)聽事件中心的max-brother事件
     // 這里的第二個參數(shù)必須使用箭頭函數(shù)
    tmpCom.$on('max-brother', val => {
      this.brother = val
    })
  }
}
</script>

4岂嗓,注入依賴provide/inject使用

這種方式就是vue中依賴注入汁展,該方法用于 父子組件之間 的通信。當然這里所說的父子不一定是真正的父子,也可以是祖孫組件食绿,在層數(shù)很深的情況下侈咕,可以使用這種方式來進行傳值。就不用一層一層的傳遞數(shù)據(jù)了器紧。

provide和inject是vue提供的兩個鉤子耀销,和data、methods是同級的铲汪。并且provide的書寫形式和data一樣熊尉。

  • provide 鉤子用來發(fā)送數(shù)據(jù)或方法焚挠。
  • inject鉤子用來接收數(shù)據(jù)或方法
//父組件  
data () {
    return {
      pimsg: '我是父組件的值',
      num: 99999
    }
  },
  provide () {
    return {
      num: this.num
    }
  },

//子組件
 inject: ['num'],

5麸俘,ref / $refs

這種方式也是實現(xiàn)父子組件之間的通信

ref:這個屬性用在子組件上,它的用法就指向了子組件的實例轻纪,可以通過實例來訪問組件的數(shù)據(jù)和方法

//子組件
export default {
    data () {
    return {
      name: '我是張三'
    }
  },
  methods: {
    sayHello () {
      console.log('我是李四')
    }
  }
}
//父組件
<template>
  <child ref="child"></child>
</template>

<script>
  import child from './child.vue'
  export default {
    components: { child },
    mounted () {
      console.log(this.$refs.child.name);  // '我是張三'
      this.$refs.child.sayHello();  // 我是李四
    }
  }
</script>

6,parent /children

  • 使用$parent可以讓組件訪問父組件的實例(訪問的是上一級父組件的屬性和方法)齿梁。
    使用 $children 可以讓組件訪問子組件的實例催植,但是, $children 并不能保證順序勺择,并且訪問的數(shù)據(jù)也不是響應式的创南。
    
    //子組件
    <template>
      <div>
        <span>{{message}}</span>
        <p>獲取父組件的值為:  {{parentVal}}</p>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          message: '張三'
        }
      },
      computed:{
        parentVal(){
          return this.$parent.msg;
        }
      }
    }
    </script>
    
    
//父組件
<template>
  <div class="hello_world">
    <div>{{msg}}</div>
    <child></child>
    <button @click="change">點擊改變子組件值</button>
  </div>
</template>

<script>
import child from './child.vue'
export default {
  components: { child },
  data() {
    return {
      msg: 'abc'
    }
  },
  methods: {
    change() {
      // 獲取到子組件
      this.$children[0].message = '李四'
    }
  }
}
</script>

通過 $parent 訪問到的是上一級父組件的實例,可以使用 $root 來訪問根組件的實例
在組件中使用$children拿到的是所有的子組件的實例省核,它是一個數(shù)組稿辙,并且是無序的
在根組件 #app 上拿 $parent 得到的是 new Vue()的實例,在這實例上再拿 $parent 得到的是undefined芳撒,而在最底層的子組件拿 $children 是個空數(shù)組
$children 的值是數(shù)組邓深,而 $parent是個對象
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末未桥,一起剝皮案震驚了整個濱河市笔刹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冬耿,老刑警劉巖舌菜,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亦镶,居然都是意外死亡日月,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門缤骨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爱咬,“玉大人,你說我怎么就攤上這事绊起【猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜂绎。 經(jīng)常有香客問我栅表,道長,這世上最難降的妖魔是什么师枣? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任怪瓶,我火速辦了婚禮,結(jié)果婚禮上践美,老公的妹妹穿的比我還像新娘洗贰。我一直安慰自己,他們只是感情好拨脉,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布哆姻。 她就那樣靜靜地躺著,像睡著了一般玫膀。 火紅的嫁衣襯著肌膚如雪矛缨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天帖旨,我揣著相機與錄音箕昭,去河邊找鬼。 笑死解阅,一個胖子當著我的面吹牛落竹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播货抄,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼述召,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蟹地?” 一聲冷哼從身側(cè)響起积暖,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怪与,沒想到半個月后夺刑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡分别,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年遍愿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耘斩。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沼填,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出括授,到底是詐尸還是另有隱情轧邪,我是刑警寧澤羞海,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布硕糊,位于F島的核電站,受9級特大地震影響螟蝙,放射性物質(zhì)發(fā)生泄漏胰默。R本人自食惡果不足惜牵署,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一奴迅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暇检,春花似錦占哟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拙毫。三九已至,卻和暖如春膘婶,著一層夾襖步出監(jiān)牢的瞬間衅码,已是汗流浹背逝段。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工棺牧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颊乘,地道東北人乏悄。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓦戚。 傳聞我的和親對象是個殘疾皇子畜疾,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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