vue組件通訊的三種方式

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

官方推薦方式javascript

有時候兩個組件也須要通訊(非父子關係)。在簡單的場景下,能夠使用一個空的 Vue 實例做爲中央事件總線。html

本質是經過派發事件而後監聽事件從而更改值,(父子組件通訊也可用這個方式,可是不一樣的一點就是父子組件通訊的時候能夠不用一個空的Vue實例來作中轉,這種方式我這裏就不作演示的了,由於個人題目是非父子通訊)vue

  • 空的Vue實例 busjava

    import Vue from 'vue'
    
    const bus = new Vue()
    export default bus
  • 組件addvuex

    <!--html結構-->
    <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>
  • 組件subapp

    <!--html結構-->
    <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>

效果圖ide

vue父子組件通訊的第三種方式


2.經過vuex來進行狀態管理

官方狀態管理ui

vuex我這裏就不詳細說了,網上教程太多。this


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

Object在內存中存儲只是保留指針,因此父組件經過props來給兄弟組件傳遞同一個對象,兄弟組件接收的對象跟父組件的對象都是指向同一個內存地址,故無論在哪裏修改都能保持一致。spa

上代碼,父組件把同一個對象傳遞給add組件和sub組件,那麼add組件和sub組件接收到的對象也是指向父組件app的對象都是指向同一個內存地址。add組件對傳入的對象進行+1的操做,sub組件進行-1的操做。

  • 父組件 app.vue

    <!--html結構-->
    <template>
      <div id="app">
        <h1>我是app父組件的newNum:{{share.newNum}}</h1>
        <hr>
        <!--將同一個對象同時傳給兩個子組件-->
        <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結構-->
    <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結構-->
    <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>

效果圖

vue父子組件通訊的第三種方式

相關文章
相關標籤/搜索