vue父子組件傳值過(guò)程:
子組件:props接收,data里同步數(shù)據(jù)
父組件:在子組件通過(guò)$emit()發(fā)送什往,父組件定義事件接收
示例代碼:
index.vue
<template>
<div class="container" @click="clickHandle">
<div class="message">{{msg}}</div>
<!-- :init-num='10' @clicknum="handleClickNum" 父子組件傳值 -->
<click-counter :init-num="10" @clicknum="handleClickNum"/>
</div>
</template>
<script>
import ClickCounter from "@/components/click-counter";
export default {
components:{ClickCounter},
data () {
return {
msg: 'Hello'
}
},
methods: {
clickHandle () {
this.msg = 'Clicked!!!!!!'
},
handleClickNum(data){
console.log('>>>',data.num)
}
}
}
</script>
<style scoped>
.message {
color: red;
padding: 10px;
text-align: center;
}
</style>
click-counter.vue
<template>
<div class="click-counter">
<div class="counter-num">次數(shù):{{num}}</div>
<button class="counter-btn" @click="handleClick">點(diǎn)我呀戈次!</button>
<button class="counter-reset-btn" @click="handleResetClick">清零</button>
</div>
</template>
<script>
export default {
props:{
initNum:{
type:Number,
default:0
}
},
data() {
return {
num: this.initNum
};
},
methods: {
handleClick() {
this.num += 1;
this.notifyNum();
},
handleResetClick() {
this.num = 0;
this.notifyNum();
},
notifyNum(){
this.$emit('clicknum',{
num:this.num
})
}
}
};
</script>
<style>
.click-counter {
display: flex;
align-items: center;
justify-content: center;
border: 1px solid red;
background-color: #ffffff;
padding: 10px;
}
.counter-num,
.counter-btn,
.counter-reset-btn {
flex: 1;
margin: 3px;
}
</style>
插槽:在組件里單獨(dú)出來(lái)一個(gè)塊,用來(lái)寫(xiě)入引入組件時(shí)添加的其他元素型宙,在父組件中可穿可不傳
<!-- :init-num='10' @clicknum="handleClickNum" 父子組件傳值 -->
<click-counter :init-num="10" @clicknum="handleClickNum">
<input type="checkbox"> 插槽
</click-counter>
<template>
<div class="click-counter">
<div class="counter-num">次數(shù):{{num}}</div>
<button class="counter-btn" @click="handleClick">點(diǎn)我呀响牛!</button>
<button class="counter-reset-btn" @click="handleResetClick">清零</button>
<slot><slot/>
</div>
</template>