vue項(xiàng)目的一大亮點(diǎn)就是組件化使套。使用組件可以極大地提高項(xiàng)目中代碼的復(fù)用率尽纽,減少代碼量。但是使用組件最大的難點(diǎn)就是父子組件之間的通信童漩。
子通信父
父組件
<template>
<div class="parent">
我是父組件
<!--父組件監(jiān)聽子組件觸發(fā)的say方法弄贿,調(diào)用自己的parentSay方法-->
<!--通過(guò):msg將父組件的數(shù)據(jù)傳遞給子組件-->
<children :msg="msg" @say="parentSay"></children>
</div>
</template>
<script>
import Children from './children.vue'
export default {
data () {
return {
msg: 'hello, children'
}
},
methods: {
// 參數(shù)就是子組件傳遞出來(lái)的數(shù)據(jù)
parentSay(msg){
console.log(msg) // hello, parent
}
},
// 引入子組件
components:{
children: Children
}
}
</script>
子組件
<template>
<div class="hello">
<div class="children" @click="say">
我是子組件
<div>
父組件對(duì)我說(shuō):{{msg}}
</div>
</div>
</div>
</template>
<script>
export default {
//父組件通過(guò)props屬性傳遞進(jìn)來(lái)的數(shù)據(jù)
props: {
msg: {
type: String,
default: () => {
return ''
}
}
},
data () {
return {
childrenSay: 'hello, parent'
}
},
methods: {
// 子組件通過(guò)emit方法觸發(fā)父組件中定義好的函數(shù),從而將子組件中的數(shù)據(jù)傳遞給父組件
say(){
this.$emit('say' , this.childrenSay);
}
}
}
</script>
子組件使用$emit方法調(diào)用父組件的方法矫膨,達(dá)到子通信父的目的差凹。
父通信子
父組件
<!--Html-->
<template>
<!--父組件觸發(fā)click方法-->
<div class="parent" @click="say">
我是父組件
<!--通過(guò)ref標(biāo)記子組件-->
<children ref="child"></children>
</div>
</template>
<script>
import Children from './children.vue'
export default {
data () {
return {
msg: "hello,my son"
}
},
methods: {
// 通過(guò)$refs調(diào)用子組件的parentSay方法
say(){
this.$refs.child.parentSay(this.msg);
}
},
// 引入子組件
components:{
children: Children
}
}
</script>
子組件
<template>
<div class="hello">
<div class="children" >
我是子組件
<div>
父組件對(duì)我說(shuō):{{msg}}
</div>
</div>
</div>
</template>
<script>
export default {
data () {
return {
msg: ''
}
},
methods: {
// 父組件調(diào)用的JavaScript方法parentSay
parentSay(msg){
this.msg = msg;
}
}
}
</script>
父組件通過(guò)$refs
調(diào)用子組件的方法。
以上就是父子組件通信的方式侧馅,父子組件傳遞數(shù)據(jù)直接用props危尿,或者使用$emit
和$refs
依靠事件來(lái)傳遞數(shù)據(jù)。
父子組件通信提升篇
上文中馁痴,子通信父是在子中觸發(fā)點(diǎn)擊事件然后調(diào)用父組件的方法谊娇,父通信子是在父中觸發(fā)點(diǎn)擊事件調(diào)用子組件的方法。但是實(shí)際情況中可能存在子通信父時(shí)子組件不允許有點(diǎn)擊事件而事件在父中或者父通信子時(shí)點(diǎn)擊事件在子組件中罗晕。
子通信父時(shí)擊事件在父組件
這種情況其實(shí)很常見济欢,例如提交一個(gè)表單時(shí)表單的內(nèi)容為子組件赠堵,而保存按鈕在父組件上。此時(shí)點(diǎn)擊保存按鈕想要獲取子組件表單的值法褥。這種情況下已經(jīng)不單單是子通信父和父通信子了茫叭,需要將兩者結(jié)合在一起使用才能完成整個(gè)通信過(guò)程币他。
實(shí)現(xiàn)的思路是在父組件中點(diǎn)擊事件時(shí)道媚,先通過(guò)父子通信調(diào)用子組件的方法,然后在子組件中的該方法里使用子父通信調(diào)用父組件的另一個(gè)方法并將信息傳遞回來(lái)冯挎。以下是代碼演示:
父組件
<template>
<div class="parent" @click="getData">
我是父組件
<!--父組件監(jiān)聽子組件觸發(fā)的transData方法杀饵,調(diào)用自己的transData方法-->
<!--通過(guò)ref標(biāo)記子組件-->
<children ref="child" @transData="transData"></children>
</div>
</template>
<script>
import Children from './children.vue'
export default {
data () {
return {
msg: 'hello, children'
}
},
methods: {
getData(){
// 調(diào)用子組件的getData方法
this.$refs.child.getData();
},
// 參數(shù)就是子組件傳遞出來(lái)的數(shù)據(jù)
transData(msg){
console.log(msg) // hello, parent
}
},
// 引入子組件
components:{
children: Children
}
}
</script>
子組件
<template>
<div class="hello">
<div class="children" >
我是子組件
<div>
子組件的數(shù)據(jù):{{childrenSay}}
</div>
</div>
</div>
</template>
<script>
export default {
data () {
return {
childrenSay: 'hello, parent'
}
},
methods: {
// 子組件通過(guò)emit方法觸發(fā)父組件中定義好的函數(shù)莽囤,從而將子組件中的數(shù)據(jù)傳遞給父組件
getData() {
this.$emit('transData' , this.childrenSay);
}
}
}
</script>
另一種情況思路也和這個(gè)一樣,基礎(chǔ)就在與父通信子和子通信父的靈活運(yùn)用切距。
轉(zhuǎn)評(píng)贊就是最大的鼓勵(lì)