爺爺組件
<template>
<div>
<child-dom
:foo="foo"
:coo="coo"
:goo='goo'
v-on:upRocket="reciveRocket"
>
</child-dom>
</div>
</template>
<script>
import childDom from "./child.vue";
export default {
data() {
return {
foo:"Hello, world",
coo:"Hello,rui",
goo:'googoo'
}
},
components:{childDom},
methods:{
reciveRocket(e){
console.log('爺爺組件傳來的值',e)
console.log("reciveRocket success")
}
}
}
</script>
父組件
<template>
<div>
<p>foo:{{foo}}</p>
<p>attrs:{{$attrs}}</p>
<grandson v-bind="$attrs" v-on="$listeners"></grandson>
</div>
</template>
<script>
import grandson from './grandson';
export default {
name:'child-dom',
props:[
"foo", //父組件不能接收,否則在孫子組件中獲取不到值
],
// inheritAttrs:false,
components:{grandson},
}
</script>
孫子組件:
<template>
<div>
<p>coo:{{coo}}</p>
<p>{{goo}}</p>
<button @click="startUpRocket">我要發射火箭</button>
</div>
</template>
<script>
export default {
name:'grandson',
props:["coo","goo"],
// inheritAttrs:false,
methods:{
startUpRocket(){
this.$emit("upRocket",'傳值到爺爺組件');
// console.log("startUpRocket")
}
}
}
</script>
首先我們來看下面的一張圖,圖中表示一個多級組件嵌套的情形。

現在我們來討論一種情況,A組件與C組件怎么通信,我們有多少種解決方案?
- 我們使用VueX來進行數據管理,但是如果項目中多個組件共享狀態比較少,項目比較小,並且全局狀態比較少,那使用VueX來實現該功能,並沒有發揮出VueX的威力。
- 使用B來做中轉站,當A組件需要把信息傳給C組件時,B接受A組件的信息,然后利用屬性傳給C組件,這是一種解決方案,但是如果嵌套的組件過多,會導致代碼繁瑣,代碼維護比較困難;如果C中狀態的改變需要傳遞給A, 使用事件系統一級級往上傳遞 。本來
- 自定義一個Vue 中央數據總線,這個情況適合碰到組件跨級傳遞消息,但是使用VueX感覺又有點浪費的項目中,但是缺點是,碰到多人合作時,代碼的維護性較低,代碼可讀性低
在很多開發情況下,我們只是想把A組件的信息傳遞給C組件,如果使用props 綁定來進行信息的傳遞,雖然能夠實現,但是代碼並不美觀。
轉:https://blog.csdn.net/songxiugongwang/article/details/84001967
