詳解vue組件通信的三種方式

1. 第一種方式就是官方推薦的

創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、宜川網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、購(gòu)物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為宜川等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

官方推薦方式

有時(shí)候兩個(gè)組件也需要通信(非父子關(guān)系)。在簡(jiǎn)單的場(chǎng)景下,可以使用一個(gè)空的 Vue 實(shí)例作為中央事件總線。

本質(zhì)是通過(guò)派發(fā)事件然后監(jiān)聽(tīng)事件從而更改值,(父子組件通信也可用這個(gè)方式,但是不同的一點(diǎn)就是父子組件通信的時(shí)候可以不用一個(gè)空的Vue實(shí)例來(lái)做中轉(zhuǎn),這種方式我這里就不做演示的了,因?yàn)槲业念}目是非父子通信)

空的Vue實(shí)例 bus

import Vue from 'vue'

const bus = new Vue()
export default bus

組件add

<!--html結(jié)構(gòu)-->
<template>
 <div>
  <p>我是add組件的num:{{num}} </p>
  <button @click='add'>增加</button>
 </div>
</template>
// js
<script>
import bus from '../bus.js'
export default {
 data() {
  return {
   num: ''
  }
 },
 methods: {
  add() {
   if (this.num) {
    this.num++
    bus.$emit('num-change', this.num)
   } else {
    this.num = 1
    bus.$emit('num-change', this.num)
   }
  }
 }
}
</script>

組件sub

<!--html結(jié)構(gòu)-->
<template>
 <div>
  <p>我是sub組件的num:{{num}}</p>
 </div>
</template>
// js
<script>
import bus from '../bus.js'
export default {
 data() {
  return {
   num: ''
  }
 },
 created() {
  bus.$on('num-change', num => {
   this.num = num
  })
 }
}
</script>

2.通過(guò)vuex來(lái)進(jìn)行狀態(tài)管理

官方狀態(tài)管理

vuex我這里就不詳細(xì)說(shuō)了,網(wǎng)上教程太多。

3.取巧利用js中的對(duì)象的特性(指針)

Object在內(nèi)存中存儲(chǔ)只是保留指針,所以父組件通過(guò)props來(lái)給兄弟組件傳遞同一個(gè)對(duì)象,兄弟組件接收的對(duì)象跟父組件的對(duì)象都是指向同一個(gè)內(nèi)存地址,故不管在哪里修改都能保持一致。

上代碼,父組件把同一個(gè)對(duì)象傳遞給add組件和sub組件,那么add組件和sub組件接收到的對(duì)象也是指向父組件app的對(duì)象都是指向同一個(gè)內(nèi)存地址。add組件對(duì)傳入的對(duì)象進(jìn)行+1的操作,sub組件進(jìn)行-1的操作。

父組件 app.vue

<!--html結(jié)構(gòu)-->
<template>
 <div id="app">
  <h2>我是app父組件的newNum:{{share.newNum}}</h2>
  <hr>
  <!--將同一個(gè)對(duì)象同時(shí)傳給兩個(gè)子組件-->
  <addnum :share1='share'></addnum>
  <hr>
  <subnum :share2='share'></subnum>
 </div>
</template>
// js
import addnum from './components/add'
import subnum from './components/sub'

export default {
 data() {
  return {
   share: {
    newNum: 1
   }
  }
 },
 components: {
  addnum, subnum
 }
}

子組件add.vue

<!--html結(jié)構(gòu)-->
<template>
 <div>
  <p>我是add組件的newNum:{{share1.newNum}} </p>
  <button @click='add'>增加</button>
 </div>
</template>
//js
<script>
export default {
 methods: {
  add() {
   this.share1.newNum++
  }
 },
 props: {
  share1: {
   type: Object,
  }
 }
}
</script>

子組件sub.vue

<!--html結(jié)構(gòu)-->
<template>
 <div>
  <p>我是sub組件的newNum:{{share2.newNum}}</p>  
  <button @click='numSub'>減少</button>
 </div>
</template>
// js
<script>
export default {
 methods: {
  numSub() {
   this.share2.newNum--
  }
 },
 props: {
  share2: {
   type: Object,
  }
 }
}
</script>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

當(dāng)前標(biāo)題:詳解vue組件通信的三種方式
新聞來(lái)源:http://muchs.cn/article14/piddde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、關(guān)鍵詞優(yōu)化域名注冊(cè)、網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司