詳解vue組件通信的三種方式
1. 第一種方式就是官方推薦的
有時(shí)候兩個(gè)組件也需要通信(非父子關(guān)系)。在簡(jiǎn)單的場(chǎng)景下,可以使用一個(gè)空的 Vue 實(shí)例作為中央事件總線。
本質(zhì)是通過派發(fā)事件然后監(jiān)聽事件從而更改值,(父子組件通信也可用這個(gè)方式,但是不同的一點(diǎn)就是父子組件通信的時(shí)候可以不用一個(gè)空的Vue實(shí)例來做中轉(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.通過vuex來進(jìn)行狀態(tài)管理
vuex我這里就不詳細(xì)說了,網(wǎng)上教程太多。
3.取巧利用js中的對(duì)象的特性(指針)
Object在內(nèi)存中存儲(chǔ)只是保留指針,所以父組件通過props來給兄弟組件傳遞同一個(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"> <h1>我是app父組件的newNum:{{share.newNum}}</h1> <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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于vue.js中關(guān)于下拉框的值默認(rèn)及綁定問題
今天小編就為大家分享一篇基于vue.js中關(guān)于下拉框的值默認(rèn)及綁定問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08vue3全局組件自動(dòng)注冊(cè)功能實(shí)現(xiàn)
本文主要講述vue3的全局公共組件的自動(dòng)注冊(cè)功能,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-02-02Vue.js響應(yīng)式數(shù)據(jù)的簡(jiǎn)單實(shí)現(xiàn)方法(一看就會(huì))
Vue最巧妙的特性之一是其響應(yīng)式系統(tǒng),下面這篇文章主要給大家介紹了關(guān)于Vue.js響應(yīng)式數(shù)據(jù)的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03Vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12vue如何使用element ui表格el-table-column在里面做判斷
這篇文章主要介紹了vue如何使用element ui表格el-table-column在里面做判斷問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08