在开发的过程中遇到这么个场景,我需要在爷组件中请求数据,请求到的数据呢需要在孙组件中使用。
爷孙组件是这样的:我有一个根组件index.vue,根组件中有一个父亲组件<Father/>,在父亲组件中又有一个子组件,我们叫他孙组件<Son/>
看到这个场景,vuex、eventBus是有些大材小用了,然后我就用了props,将数据传递给<Father/>,又将这个值通过props传给<Son/>。但是这么传递似乎又感觉有些low了,那有没有更好的办法呢?确实有!那就是$attrs和$listeners。
(需要注意的是父组件中不需要接收props,只要在孙组件中接收就可以。)

然后上代码:
//index.vue:
<Father :homeInfo="homeInfo"/>
//Father.vue:
<Son v-bind="$attrs"/>
//son.vue:
<template>
<div class="home">
{{homeInfo.name}}
</div>
</template>
<script>
export default {
name: "Son",
data() {
return {};
},
props: {
homeInfo: {
default: Object,
default: () => {},
},
},
};
</script>
然后上代码:
//index.vue:
<Father :homeInfo="homeInfo" @update="update"/>
//Father.vue:
<Son v-bind="$attrs" v-on="$listeners"/>
//son.vue:
<template>
<div class="home" @click="update">
{{homeInfo.name}}
</div>
</template>
<script>
export default {
name: "Son",
data() {
return {};
},
props: {
homeInfo: {
default: Object,
default: () => {},
},
},
methods: {
update() {
const newHome = {
name: 'new'
}
this.$emit("update", newHome)
}
}
};
</script>
其实$attrs和$listeners相当于是一个中转,主要用在父亲组件上。爷组件和孙组件保持以前的使用即可!