Vue父子组件通信props不生效怎么办?
我在父组件里传了个数组给子组件,但子组件里用props接收后打印出来是空的,明明父组件的数据已经加载完了啊。
父组件这样传的::list="myData",子组件props也声明了list: Array,但就是拿不到数据,是不是哪里写错了?
<!-- 父组件 -->
<template>
<ChildComponent :list="myData" />
</template>
<script>
export default {
data() {
return {
myData: []
}
},
async mounted() {
this.myData = await fetchData(); // 假设这里返回 [1,2,3]
}
}
</script>
<!-- 子组件 -->
<template>
<div>{{ list }}</div>
</template>
<script>
export default {
props: ['list']
}
</script>
你父组件的
myData初始是空数组,然后在mounted里异步赋值。问题在于:子组件在父组件mounted执行的时候就已经挂载了,那时候myData还是空的呢。虽然后来数据拿到了,但子组件的props变化了你可能没感知到。两种解决思路:
一是用
watch监听 props 变化,在子组件里加:二是确保父组件数据拿到后再渲染子组件,用
v-if控制:先试一下第一种,加个 watch 看看能不能收到数据。如果能收到,说明就是时序问题。如果收不到,那可能是你
fetchData()那边返回的数据有问题,可以先在父组件里打印一下this.myData看看到底有没有值。还有,你 props 声明用
props: ['list']就行,不用写list: Array,Vue 会自动推断类型,写多了反而容易出问题。或者子组件里用watch监听props变化: