Vue組件通信方法案例總結(jié)
一、父組件向子組件傳值(props)
步驟:
- 在父組件中通過
v-bind將數(shù)據(jù)傳給子組件 - 在子組件中通過
props接收父組件傳遞過來的數(shù)據(jù)
<div id="app">
<!-- 1.通過 v-bind 將數(shù)據(jù)傳給子組件 -->
<test v-bind:ss='name'></test>
</div>
<script>
var a = new Vue({
el:'#app',
data:{
name:'bing',
},
components: {
test:{
props: ['ss'], // 2.接收父組件傳遞過來的數(shù)據(jù)
template:"<p>{{ss}}</p>"
}
}
})
</script>
props使得父子之間形成一種 單向數(shù)據(jù)流 ,父元素更新的時(shí)候,子元素的狀態(tài)也會隨之改變。
但反之會導(dǎo)致你的應(yīng)用的數(shù)據(jù)流向難以理解,因此在子組件中不能修改父組件中的數(shù)據(jù)。
二、子組件向父組件傳值($emit)
子組件通過 $emit 事件向父組件發(fā)送消息,將自己的數(shù)據(jù)傳遞給父組件。
步驟:
- 在子組件上綁定一個(gè)
click事件,觸發(fā)increment方法 - 在
increment方法中用$emit定義一個(gè)自定義事件increment,同時(shí)傳入this.counter參數(shù) - 在父組件上綁定步驟2中自定義的
increment事件,方法名為incrementTotal - 在父組件中調(diào)用步驟3中的
incrementTotal方法,這時(shí)incrementTotal方法就能接收到子組件傳入的參數(shù)
<div id="app">
<p>{{ total }}</p>
<button-counter v-on:increment="incrementTotal"></button-counter> <!-- 步驟3 -->
</div>
<script>
Vue.component('button-counter', {
template: '<button v-on:click="increment">{{ counter }}</button>', // 步驟1
data: function () {
return {
counter: '子組件的數(shù)據(jù)'
}
},
methods: {
increment: function () {
this.$emit('increment', this.counter); // 步驟2
}
}
});
new Vue({
el: '#app',
data: {
total: '父組件的數(shù)據(jù):'
},
methods: {
incrementTotal: function (e) { // 步驟4
this.total = this.total + e[0]
console.log(e);
}
}
})
</script>
三、兄弟組件傳值(EventBus)
如果不需要類似 Vuex 這樣的庫來處理組件之間的數(shù)據(jù)通信,就可以考慮Vue中的 事件總線(EventBus) 來通信。
在 Vue 中可以使用 EventBus 來作為溝通橋梁的概念,就像是所有組件共用相同的事件中心,可以向該中心注冊發(fā)送事件或接收事件,所以組件都可以上下平行地通知其他組件。
但也就是太方便所以若使用不慎,就會造成難以維護(hù)的“災(zāi)難”,因此才需要更完善的Vuex作為狀態(tài)管理中心,將通知的概念上升到共享狀態(tài)層次。
這個(gè)方法是通過創(chuàng)建一個(gè)空的 vue 實(shí)例,當(dāng)做 $emit 事件的處理中心(事件總線),通過他來觸發(fā)以及監(jiān)聽事件,方便的實(shí)現(xiàn)了任意組件間的通信,包含父子,兄弟,隔代組件。具體如下:
1. 初始化(new Vue())
首先需要創(chuàng)建事件總線并將其導(dǎo)出,以便其它模塊可以使用或者監(jiān)聽它。
我們可以通過兩種方式來處理。
方法一: 新創(chuàng)建一個(gè) event-bus.js 文件
// event-bus.js import Vue from 'vue' export const EventBus = new Vue()
方法二: 直接在項(xiàng)目中的 main.js 初始化 EventBus
// main.js Vue.prototype.$EventBus = new Vue() // 注意:這種方式初始化的EventBus是一個(gè)全局的事件總線
現(xiàn)在我們已經(jīng)創(chuàng)建了 EventBus ,接下來你需要做到的就是在你的組件中加載它,并且調(diào)用同一個(gè)方法,就如你在父子組件中互相傳遞消息一樣。
2. 發(fā)送事件($emit())
假設(shè)有兩個(gè)Vue頁面需要通信: A 和 B 。A頁面中在按鈕上面綁定了點(diǎn)擊事件,發(fā)送一則消息,想通知 B頁面。
<!-- A.vue -->
<template>
<button @click="sendMsg()">-</button>
</template>
<script>
import { EventBus } from "../event-bus.js";
export default {
methods: {
sendMsg() {
EventBus.$emit("aMsg", '來自A頁面的消息'); // 對外發(fā)送數(shù)據(jù)
}
}
};
</script>
3. 接收事件($on())
接下來,需要在 B頁面中接收這則消息。
<!-- B.vue -->
<template>
<p>{{msg}}</p>
</template>
<script>
import { EventBus } from "../event-bus.js";
export default {
data() {
return {
msg: ''
}
},
mounted() {
EventBus.$on("aMsg", (msg) => { // 接收 A 發(fā)送來的消息
this.msg = msg;
});
}
};
</script>
4. 移除事件監(jiān)聽者
前面提到過,如果使用不善,EventBus會是一種災(zāi)難,到底是什么樣的“災(zāi)難”了?大家都知道vue是單頁應(yīng)用,如果你在某一個(gè)頁面刷新了之后,與之相關(guān)的EventBus會被移除,這樣就導(dǎo)致業(yè)務(wù)走不下去。還要就是如果業(yè)務(wù)有反復(fù)操作的頁面,EventBus在監(jiān)聽的時(shí)候就會觸發(fā)很多次,也是一個(gè)非常大的隱患。這時(shí)候我們就需要好好處理EventBus在項(xiàng)目中的關(guān)系。通常會用到,在vue頁面銷毀時(shí),同時(shí)移除EventBus事件監(jiān)聽。
如果想移除事件的監(jiān)聽,可以像下面這樣操作:
import { EventBus } from "../event-bus.js";
EventBus.$off('aMsg', {})
EventBus.$off('aMsg')移除應(yīng)用內(nèi)所有對此某個(gè)事件的監(jiān)聽。
或者直接調(diào)用 EventBus.$off() 來移除所有事件頻道,不需要添加任何參數(shù) 。
四、Vuex
在做中大型的單頁應(yīng)用的時(shí)候,例如需要多人協(xié)作開發(fā),全局維護(hù)登錄狀態(tài)等,我們最好還是選擇vuex來進(jìn)行狀態(tài)管理。
到此這篇關(guān)于Vue組件通信方法案例總結(jié)的文章就介紹到這了,更多相關(guān)Vue組件通信方法總結(jié)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nuxt.js結(jié)合Serverless構(gòu)建無服務(wù)器應(yīng)用
Nuxt.js是一個(gè)基于Vue.js的框架,結(jié)合Serverless架構(gòu),Nuxt.js可以讓你構(gòu)建高度可擴(kuò)展、成本效益高的無服務(wù)器應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
使用sessionStorage解決vuex在頁面刷新后數(shù)據(jù)被清除的問題
localStorage沒有時(shí)間期限,除非將它移除,sessionStorage即會話,當(dāng)瀏覽器關(guān)閉時(shí)會話結(jié)束,有時(shí)間期限,具有自行百度。本文使用的是sessionStorage解決vuex在頁面刷新后數(shù)據(jù)被清除的問題,需要的朋友可以參考下2018-04-04
vue使用element-resize-detector監(jiān)聽元素寬度變化方式
這篇文章主要介紹了vue使用element-resize-detector監(jiān)聽元素寬度變化方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Vue3使用Vue Router實(shí)現(xiàn)前端路由控制
在現(xiàn)代Web應(yīng)用中,前端路由控制是非常重要的一部分,它可以幫助我們將不同的頁面內(nèi)容展示給用戶,同時(shí)保持用戶在瀏覽不同頁面時(shí)的連貫性,本文將介紹如何使用Vue Router來實(shí)現(xiàn)前端路由控制,需要的朋友可以參考下2024-10-10
vue+iview 兼容IE11瀏覽器的實(shí)現(xiàn)方法
這篇文章主要介紹了vue+iview 兼容IE11瀏覽器的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01
ElementUI Tag組件實(shí)現(xiàn)多標(biāo)簽生成的方法示例
這篇文章主要介紹了ElementUI Tag組件實(shí)現(xiàn)多標(biāo)簽生成的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Vue數(shù)據(jù)驅(qū)動模擬實(shí)現(xiàn)2
這篇文章主要介紹了Vue數(shù)據(jù)驅(qū)動模擬實(shí)現(xiàn)的相關(guān)資料,實(shí)現(xiàn)Observer構(gòu)造函數(shù),監(jiān)聽已有數(shù)據(jù)data中的所有屬性,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01

