Vue2.0 組件傳值通訊的示例代碼
在Vue項目中,我們經常把某個功能模塊封裝起來,形成組件,下次調用時非常方便,同時也是在一些循環(huán)中進行dom操作的一種較好方式。
本次我想以一個評價組件來說一下組件的事件和參數(shù)是怎樣傳遞的,如何完成的組件通訊。
示例如下:

這里先說一下組件設計思路:
明確整個功能場景,找出存在的事件操作,此例是一個簡單的評價功能,即點擊某一個星星時左邊以及當前為選中的黃色星,右邊為未選中的白色星。
確定可復用的組件,即具有重復操作的模塊,這里明顯的每一個星星為一個可復用組件, 其實還有個星星變成白色和黃色也是一個小組件,這種在具體寫的時候覺得可以再分即可。
至此一個劃分了三個組件:JudgeOf、JudgeStar、StarImg
這里需要明確的是,在大多數(shù)的組件通訊中,父組件往子組件傳遞的都是數(shù)據(jù),子組件往父組件傳遞的才是事件,
我們姑且稱父到子走的是一個數(shù)據(jù)流,子到父走的是一個事件流,了解這一點基本可以很好的了解組件通訊的情況。

JudgeOf組件:
基本的外框,循環(huán)starList構成三個評分選項。向子組件傳遞選項名字,和當前選項的索引
<template>
<div>
<div class="judge-modal" @click="cancel"></div>
<div class="judge">
<br>
<div class="text-center font16">評價</div>
<judge-star v-for="item,index in starList" :key="index" @judge="judge" :name="item.name" :index="index" ></judge-star>
<br>
<div class="box container text-left">
<span class="icon-i"></span> 評價內容
</div>
<div class="bgfff container font14">
<textarea placeholder="請輸入您的評價,方便我們改進,謝謝!" type="textarea" class="textarea" rows="6" v-model="judgeTxt"></textarea>
</div>
<div class="container">
<br>
<div class="btn btn_block text-center" @click="submit">提交</div>
</div>
</div>
</div>
</template>
<script>
import JudgeStar from './judgeStar.vue'
export default{
data(){
return{
starList:[
{name:'服務態(tài)度',key:'evaluate.serviceStarLevel'},
{name:'責任感',key:'evaluate.dutyStarLevel'},
{name:'準時度',key:'evaluate.onTimeStarLevel'},
],
evaluate:[],
judgeTxt:''
}
},
components:{
JudgeStar
},
computed:{
},
methods:{
cancel(){
this.$emit('cancel')
},
submit(){
let data = '';
this.starList.forEach((val,index)=>{
data =`${val.key}:${this.evaluate[index]}`
console.log(data)
});
},
judge(data){
this.evaluate[data[0]]=data[1];
}
}
}
</script>
JudgeStar組件:
在這里注冊一個chooseIndex,當點擊某一個星星時,StarImg組件emit當前星星的index,JudgeStar組件中接收此參數(shù)并賦值給chooseIndex,同時StarImg里面watch這個參數(shù),大于index表明沒有被選中,反之則為選中,
<template>
<div class="flex_cont container">
<div class="flex_item name">{{name}}</div>
<div class="flex_item">
<star-img @choose="choose" v-for="item,index in starArr" :key="index" :chooseIndex="chooseIndex" :index="index"></star-img>
</div>
</div>
</template>
<script>
import StarImg from './starImg.vue'
export default{
props:{
name:String,
index:''
},
data(){
return{
chooseIndex:4,
starArr:Array.from({ length: 5 })
}
},
components:{
StarImg
},
mounted(){
this.$emit('judge',[this.index,this.chooseIndex+1]);
},
methods:{
choose(data){
this.chooseIndex = data;
this.$emit('judge',[this.index,this.chooseIndex+1]);
}
}
}
</script>
StarImg組件:
觀察chooseIndex值的變化
<template>
<i style="margin: 0 3px;" :class="icon" @click="choose"></i>
</template>
<script>
export default{
props:{
index:Number, //當前星星的索引
chooseIndex:Number //選中星星的索引
},
data(){
return{
icon:'icon-star'
}
},
watch:{
//大于index表明沒有被選中,反之則為選中,
chooseIndex:function () {
if(this.chooseIndex>=this.index){
this.icon = 'icon-star'
} else {
this.icon = 'icon-star2'
}
},
},
methods:{
choose(){
/*所選星星最大索引*/
this.$emit('choose',this.index)
}
},
created(){
}
}
</script>
總結一下:
- 父組件通過v-bind:綁定參數(shù)傳給子組件,子組件通過props接受這個參數(shù)。
- 在組件的最底層開始寫事件,由最底層組件逐步向上$emit事件流,并攜帶相應參數(shù),最后在父組件內完成總的數(shù)據(jù)處理。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
vue組件屬性(props)及私有數(shù)據(jù)data解析
這篇文章主要介紹了vue組件屬性(props)及私有數(shù)據(jù)data解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
Vue+ElementUI 中級聯(lián)選擇器Bug問題的解決
這篇文章主要介紹了Vue+ElementUI 中級聯(lián)選擇器Bug問題的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
vue項目前端加前綴(包括頁面及靜態(tài)資源)的操作方法
這篇文章主要介紹了vue項目前端加前綴(包括頁面及靜態(tài)資源)的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-12-12
Vue中的百度地圖定位BMap.GeolocationControl的用法
BMap.GeolocationControl?是百度地圖API中的一個類,用于添加地理定位控件到地圖上,以便用戶可以通過該控件獲取自己的當前位置,本文給大家介紹Vue中的百度地圖定位BMap.GeolocationControl的用法,感興趣的朋友跟隨小編一起看看吧2023-10-10
vue3中<script?setup>?和?setup函數(shù)的區(qū)別對比
這篇文章主要介紹了vue3中<script?setup>?和?setup函數(shù)的區(qū)別,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04

