A組件與C組件怎么通信,我們有多少種解決方案?
- 我們使用VueX來進行數據管理,但是如果項目中多個組件共享狀態比較少,項目比較小,並且全局狀態比較少,那使用VueX來實現該功能,並沒有發揮出VueX的威力。
- 使用B來做中轉站,當A組件需要把信息傳給C組件時,B接受A組件的信息,然后利用屬性傳給C組件,這是一種解決方案,但是如果嵌套的組件過多,會導致代碼繁瑣,代碼維護比較困難;如果C中狀態的改變需要傳遞給A, 使用事件系統一級級往上傳遞 。本來
- 自定義一個Vue 中央數據總線,這個情況適合碰到組件跨級傳遞消息,但是使用VueX感覺又有點浪費的項目中,但是缺點是,碰到多人合作時,代碼的維護性較低,代碼可讀性低
在很多開發情況下,我們只是想把A組件的信息傳遞給C組件,如果使用props 綁定來進行信息的傳遞,雖然能夠實現,但是代碼並不美觀。
在vue2.4中,為了解決該需求,引入了$attrs 和$listeners , 新增了inheritAttrs 選項。 在版本2.4以前,默認情況下父作用域的不被認作props的屬性屬性百年孤獨,將會“回退”且作為普通的HTML特性應用在子組件的根元素上。如下列的例子
father.vue 組件:
<template> <child :name="name" :age="age" :infoObj="infoObj" @updateInfo="updateInfo" @delInfo="delInfo" /> </template> <script> import Child from './child.vue' export default { name: 'father', components: { Child }, data () { return { name: 'myName', age: 22, infoObj: { from: '北京', hobby: ['1', '2', '3'] } } }, methods: { updateInfo () { console.log('update info') }, delInfo () { console.log('delete info') } } } </script>
child.vue 組件:
<template>
<grand-son :height='height' :weight='weight' @addInfo="addInfo" v-bind="$attrs" v-on="$listeners" />
</template>
<script>
import GrandSon from './grandSon'
export default {
name: 'child',
components: { GrandSon },
props: ['name'],
data () {
return {
height: '180cm',
weight: '70kg'
}
},
created () {
console.log(this.$attrs, 'child $attrs')
// 結果:age, infoObj, 因為父組件共傳來name, age, infoObj三個值,由於name被 props接收了,所以只有age, infoObj屬性
console.log(this.$listeners, 'child $listeners') // updateInfo: f, delInfo: f
},
methods: {
addInfo () {
console.log('add info')
}
}
}
</script>
grandSon.vue組件:
<template>
<div>
{{ $attrs }}
</div>
</template>
<script>
export default {
props: ['weight'],
created () {
console.log(this.$attrs, 'grandSon attrs')
console.log(this.$listeners, 'grandSon listeners') // updateInfo: f, delInfo: f, addInfo: f
// this.$listeners.updateInfo() //和下面$emit同等效果
// this.$emit('updateInfo') // 可以觸發 father 組件中的updateInfo函數
}
}
</script>
轉載修改於:https://blog.csdn.net/songxiugongwang/article/details/84001967
