对于"vue父组件异步传递props值,子组件接收不到"这种情况,解决方案主要有以下两种:
方法一:在子组件中使用$nextTick
如果父组件异步修改了props值导致子组件接收不到,可以在子组件中使用Vue的nextTick函数:
// 父组件
<template>
<child :propA="data">
</template>
<script>
export default {
data() {
return {
data: 'old value'
}
},
mounted() {
setTimeout(() => {
this.data = 'new value'
}, 1000)
}
}
</script>
// 子组件
<template>
<div>{{ propA }}</div>
</template>
<script>
export default {
props: ['propA'],
mounted() {
this.$nextTick(() => {
console.log(this.propA) // 输出 'new value'
})
}
}
</script>
父组件将data属性异步修改为'new value',并传递给子组件的propA属性,此时在子组件的mounted生命周期中打印的propA属性值为'old value',因为Vue异步更新数据需要时间,此时的$nextTick函数就派上用场了,它会在下次DOM更新循环结束之后执行延迟回调,这样就能确保在子组件获取到最新的propA属性值,从而避免了子组件接收不到父组件传递的props值的问题。
方法二:使用watch监听props变化
还可以使用watch监听props变化,一旦props更新,就更新子组件自己的数据。
// 父组件
<template>
<child :propA="data">
</template>
<script>
export default {
data() {
return {
data: 'old value'
}
},
mounted() {
setTimeout(() => {
this.data = 'new value'
}, 1000)
}
}
</script>
// 子组件
<template>
<div>{{ propA }}</div>
</template>
<script>
export default {
props: ['propA'],
data() {
return {
localPropA: ''
}
},
watch: {
propA() {
this.localPropA = this.propA;
}
},
mounted() {
console.log(this.localPropA) // 输出 'old value'
}
}
</script>
父组件将data属性异步修改为'new value',并传递给子组件的propA属性,此时在子组件的mounted生命周期中打印的localPropA属性值为'old value',但是通过监听propA属性的变化,将最新的propA属性赋值给localPropA属性,这样就确保了子组件接收到最新的属性值,从而避免了子组件接收不到父组件传递的props值的问题。
除此之外,还可以使用Vuex来管理应用程序的状态,从而实现组件之间的状态共享,减少因为属性传递而造成的麻烦。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue父组件异步传递props值,子组件接收不到解决方案 - Python技术站