官方推薦方式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
官方狀態管理ui
vuex我這裏就不詳細說了,網上教程太多。this
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>
效果圖