背景


如标题所示,是因为vue watch props无效才看到这篇文章的。网上有一堆讲这个问题的解决办法。比如:watch(() => props.val1, (newValue) => {...})。但是我用Vue3.3.4尝试后,也是没有成功。可能是因为props.val1是一个Ref的问题吧,具体也没研究。
但是我这边是这样一个场景,所以需要用watch监测props的变化。
我有一个A.vue,需要通过props传给B.vue。而B.vue使用这个props构建一个ref,用于展示界面。我希望在A.vue中更改传递给B的props的值,以达到B.vue更改界面的需求。但是有一个问题,ref只在onMounted的时候,初始化一次,后面不管怎样改动props,这个ref都不会改变。所以才使用watch监测props的变化,进而重新赋值给ref。但是我没成功。
那好,那我就在B.vue中通过defineExpose导出一个函数比如reset(),专门用于给ref重新赋值给props,比如

const props = defineProps({
	propsVal: String
})
const valRef = ref(props.propsVal)

function reset() {
	valRef.value = props.propsVal
}
defineExpose({
	reset,	// 导出后,A.vue中可以调用B.vue中的reset方法
})

这样A.vue中,更改props的传入值后,调用一下B.vue的reset()就可以了。
但是这个方法,很麻烦,有时候也会出现reset() function is not define.的错误提示。

解决方案


使用计算属性computed,而不是引用ref
因为计算属性也具有响应性,也能过引起界面的更改。而且props的更改,能反映到computed属性的更改。更改一下上面的例子:

const props = defineProps({
	propsVal: String
})
const valComputed = computed(props.propsVal)

<tempate>
	<p> {{ valComputed }} </p>
</tempate>

补充


  1. 传给props的必须是一个简单类型(比如boolean、number)或者是响应式对象(比如reactive({}))。
GitHub 加速计划 / vu / vue
108
18
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:3 个月前 )
9e887079 [skip ci] 1 年前
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 1 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐