vue說到組件通信,無非是父組件傳子組件,子組件傳父組件,跨級組件傳值,同級組件傳值
一、父組件傳子組件,核心--props
在這里觸發 handleClick 點擊事件,額外聲明一個clickData,點擊按鈕將 inpMessage 的值賦給 clickData ,再傳給子組件
父組件index.vue
-
<template>
-
<div>
-
<input type="text" v-model="inpMessage">
-
<button @click="handleClick">點擊傳給子組件</button>
-
<children :message="clickData" /> //message為子組件props接收的值,clickData為父組件要傳的值
-
</div>
-
</template>
-
-
<script>
-
import children from './page/children'
-
export default {
-
name: "index",
-
components:{
-
children
-
},
-
data(){
-
return{
-
inpMessage:'',
-
clickData:''
-
}
-
},
-
methods:{
-
handleClick(){
-
//賦值
-
this.clickData = this.inpMessage
-
},
-
}
-
}
-
</script>
-
-
<style></style>
子組件children.vue
-
<template>
-
<div>
-
<input type="text" v-model="childrenMessage">
-
<!--<button @click="childClick">傳值給父組件</button>-->
-
</div>
-
</template>
-
-
<script>
-
export default {
-
name: "children",
-
props:{
-
message:String //接收父組件傳過來的值,這是稍微高級一點的寫法,也可以props:[' message']
-
},
-
data(){
-
return{
-
childrenMessage:''
-
}
-
},
-
created(){
-
this.childrenMessage=this.message //初始化時候的賦值
-
},
-
}
-
</script>
-
-
<style scoped>
-
-
</style>
上面是父組件傳值給子組件的過程,最重要的點是props接收,上面是點擊事件傳值,還有一種場景是動態傳值,實時更新父組件的值,自組件動態更新,這里就要用到watch了,附上自組件代碼
子組件:watch監聽法
-
<template>
-
<div>
-
<input type="text" v-model="childrenMessage">
-
<!--<button @click="childClick">傳值給父組件</button>-->
-
</div>
-
</template>
-
-
<script>
-
export default {
-
name: "children",
-
props:{
-
message:String
-
},
-
data(){
-
return{
-
childrenMessage:''
-
}
-
},
-
created(){
-
this.childrenMessage=this.message
-
},
-
-
//這里用watch方法來監聽父組件傳過來的值,來實現實時更新
-
watch:{
-
message(val){ //message即為父組件的值,val參數為值
-
this.childrenMessage = val //將父組件的值賦給childrenMessage 子組件的值
-
}
-
}
-
-
}
-
</script>
-
-
<style scoped>
-
-
</style>
二、子組件傳父組件,核心--$emit,這里附上完整父子傳值的代碼,vue是不允許子組件向父組件傳值去改變父組件的值的,但是我們可以通過自定義事件的形式去改變值,例如點擊事件,再通過$emit來傳遞,代碼注釋中有介紹。
父組件
-
<template>
-
<div>
-
<input type="text" v-model="inpMessage">
-
<button @click="handleClick">點擊傳給子組件</button>
-
//@messageData為子組件聲明傳遞過來的值,函數,getData為函數,val參數是傳遞過來的值
-
<children :message="clickData" @messageData="getData"/>
-
</div>
-
</template>
-
-
<script>
-
import children from './page/children'
-
export default {
-
name: "index",
-
components:{
-
children
-
},
-
data(){
-
return{
-
inpMessage:'',
-
clickData:''
-
}
-
},
-
methods:{
-
handleClick(){
-
this.clickData = this.inpMessage
-
},
-
//接收子組件傳遞的值,val參數是傳遞過來的值 ,給inpMessage 賦值,子組件改變父組件的值
-
getData(val){
-
this.inpMessage = val
-
console.log(val)
-
}
-
}
-
}
-
</script>
-
-
<style></style>
子組件
-
<template>
-
<div>
-
<input type="text" v-model="childrenMessage">
-
<button @click="childClick">傳值給父組件</button>
-
</div>
-
</template>
-
-
<script>
-
export default {
-
name: "children",
-
props:{
-
message:String
-
},
-
data(){
-
return{
-
childrenMessage:''
-
}
-
},
-
created(){
-
this.childrenMessage=this.message
-
},
-
methods:{
-
//點擊傳值給父組件,通過$emit傳遞,第一個參數messageData相當於傳播的媒介,this.childrenMessage為需要傳遞的值,后面也可以傳遞多個參數
-
childClick(){
-
this.$emit('messageData',this.childrenMessage)
-
console.log(this.childrenMessage)
-
}
-
},
-
watch:{
-
message(val){
-
this.childrenMessage = val
-
}
-
}
-
-
}
-
</script>