vue組件間的通信,子組件向父組件傳值的方式匯總
寫vue,如果頁(yè)面涉及到多個(gè)組件,就會(huì)涉及組件之間的通信,可能是父子組件間的通信,也可以是同級(jí)組件間的通信,那么,vue里面的組件如何通信。
一般來說在vue的數(shù)據(jù)傳遞是在父組件傳子組件通過屬性來傳,子組件傳父組件通過事件來傳值。
- 子組件通過通過this.$emit()的方式將值傳遞給父組件;
- 通過vuex來傳遞組件間的數(shù)據(jù);
- 通過中央總線來傳遞組件間的數(shù)據(jù);
- 通過修改父組件傳過來的對(duì)象屬性
- 父組件使用子組件的引用ref調(diào)用子組件的方法獲取子組件的數(shù)據(jù)
一、子組件通過this.$emit()的方式將值傳遞給父組件
父組件里面的子組件通過@func綁定一個(gè)函數(shù)來處理
子組件傳過來的數(shù)據(jù)
<template>
<div class="app">
<input @click="sendMsg" type="button" value="給父組件傳遞值">
</div>
</template>
<script>
export default {
data () {
return {
//將msg傳遞給父組件
msg: "我是子組件的msg",
}
},
methods:{
sendMsg(){
//func: 是父組件指定的傳數(shù)據(jù)綁定的函數(shù),this.msg:子組件給父組件傳遞的數(shù)據(jù)
this.$emit('func',this.msg)
}
}
}
</script>
父組件
<template>
<div class="app">
<child @func="getMsgFormSon"></child>
</div>
</template>
<script>
import child from './child.vue'
export default {
data () {
return {
msgFormSon: "this is msg"
}
},
components:{
child,
},
methods:{
getMsgFormSon(data){
this.msgFormSon = data
console.log(this.msgFormSon)
}
}
}
</script>
二、通過vuex來傳遞組件間的數(shù)據(jù)
vuex就是把數(shù)據(jù)放到內(nèi)存里面去,各個(gè)組件間都可以共享vuex里面的數(shù)據(jù)
1.在一個(gè)組件間調(diào)用this.$store.dispatch(‘findUserInfoList’, q_userInfo_form); 來觸發(fā)vuex里面函數(shù)修改vuex的數(shù)據(jù),然后在另一個(gè)組件用計(jì)算屬性映射獲取vuex的這個(gè)屬性值,就可以實(shí)現(xiàn)組件間的數(shù)據(jù)傳遞
computed: mapState({
//映射vuex的相關(guān)屬性值
userInfoList: state => state.userInfoModule.userInfoList,
start: state => state.userInfoModule.start,
total: state => state.userInfoModule.total,
}),
method:{
//查詢操作
findUserInfoList: function(q_userInfoForm, start){
this.q_userInfoForm.start = (start === null) ? 1 : start;
this.$store.dispatch('findUserInfoList', q_userInfo_form);
},
}
三、通過中央總線來傳遞組件間的數(shù)據(jù)
對(duì)于一些簡(jiǎn)單的項(xiàng)目里的可能又不是父子組件,可能是同級(jí)組件的,另一方面又沒有必要使用Vuex,針對(duì)這種情形可以使用中央事件總線(Event Bus)來解決問題,主要用到vue對(duì)象的$on和$emit事件,在同一個(gè)vue的實(shí)例可以觸發(fā)這兩個(gè)事件,比如子組件傳遞數(shù)據(jù)到父組件,在子組件通過同一個(gè)vue對(duì)象觸發(fā)$emit事件傳遞數(shù)據(jù),在父組件通過vue實(shí)例的$on監(jiān)聽剛剛emit觸發(fā)的事件來獲取子組件傳遞過來的數(shù)據(jù)
先創(chuàng)建一個(gè)constantsBus.js文件,里面根據(jù)不同模塊創(chuàng)建相關(guān)的vue實(shí)例
/** * 不同組件間通訊用的 中央事件總線 */ import Vue from 'vue'; //用戶管理總線 export const userBus = new Vue(); //管理員管理總線 export const adminBus = new Vue();
在一個(gè)組件間調(diào)用$emit傳遞數(shù)據(jù)
//引用剛剛創(chuàng)建的constantsBus.js import * as constantsBus from '@/common/constantsBus';

在另個(gè)接收數(shù)據(jù)的組件用$on來監(jiān)聽獲取emit傳過來的數(shù)據(jù)
created() {
let that = this;
//監(jiān)聽子組件的事件,獲取其他組件傳遞過來的data數(shù)據(jù)
constantsBus.processBus.$on('processChooseAssessor', data => {
//獲取emit觸發(fā)的processChooseAssessor事件傳遞過來的data數(shù)據(jù)
});
},
四、通過修改父組件傳過來的對(duì)象屬性
一般來說在vue的數(shù)據(jù)傳遞是在父組件傳子組件通過屬性來傳,但是通過屬性來傳值,是單向的,子組件不能修改父組件的prop值,如果在子組件里面修改父組件傳過來的prop屬性值,會(huì)報(bào)錯(cuò),但是也有例外,對(duì)象類型的除外,如果父組件傳給子組件的屬性是對(duì)象的話,是可以修改對(duì)象里面的值的,并且修改后也對(duì)父組件可見,因?yàn)閷?duì)象的話最后的引用都是指向同一塊內(nèi)存,不受子組件不可以修改父組件的屬性約束。(不過不建議這樣處理,子組件可以修改父組件的屬性會(huì)污染數(shù)據(jù)傳遞,可能以后在那個(gè)子組件改了都不知道,一般對(duì)象的傳遞要深拷貝)
五、父組件使用子組件的引用ref
調(diào)用子組件的方法獲取子組件的數(shù)據(jù)
1.在子組件寫一個(gè)獲取數(shù)據(jù)的方法

2.父組件通過子組件的ref調(diào)用這個(gè)方法獲取子組件的數(shù)據(jù)
<trademark-file-upload ref="trademarkFileUpload" :uploadFileList="uploadFileList"></trademark-file-upload> <script> let fileList = this.$refs.trademarkFileUpload.getFileList(); <script>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue?使用?ElementUi?el-upload?手動(dòng)上傳文件限制上傳文件類型大小同名等進(jìn)行限制
個(gè)人在做文件上傳功能的時(shí)候,踩過不少的坑,特在此記錄下,本文介紹Vue使用?ElementUi?el-upload?手動(dòng)上傳文件限制上傳文件類型大小同名等進(jìn)行限制問題,感興趣的朋友一起看看吧2024-02-02
解決基于 keep-alive 的后臺(tái)多級(jí)路由緩存問題
這篇文章主要介紹了解決基于 keep-alive 的后臺(tái)多級(jí)路由緩存問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
使用 vue 實(shí)例更好的監(jiān)聽事件及vue實(shí)例的方法
這篇文章主要介紹了使用 vue 實(shí)例更好的監(jiān)聽事件及vue實(shí)例的方法,介紹了一種新增 vue 實(shí)例的方法,單獨(dú)監(jiān)聽事件,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
vue3使用vue3-print-nb實(shí)現(xiàn)區(qū)域打印功能
這篇文章主要給大家介紹了關(guān)于vue3使用vue3-print-nb實(shí)現(xiàn)區(qū)域打印功能的相關(guān)資料,在日常操作中,相信很多人在Vue怎么用插件實(shí)現(xiàn)打印功能問題上存在疑惑,需要的朋友可以參考下2023-07-07
Vue實(shí)現(xiàn)搜索 和新聞列表功能簡(jiǎn)單范例
本文通過實(shí)例代碼給大家介紹了Vue實(shí)現(xiàn)搜索 和新聞列表功能簡(jiǎn)單范例,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2018-03-03
vant-ui框架的一個(gè)bug(解決切換后onload不觸發(fā))
這篇文章主要介紹了vant-ui框架的一個(gè)bug(解決切換后onload不觸發(fā)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11

