props
是单向数据流,我需要在 props
修改的时候,拿到传递进去的 props
值的拷贝,并在子组件中将其变成响应式的,但我将其变成响应式时,反而修改了父组件的值,代码如下
const props = defineProps<{
formValue: Bug;
}>();
// props.formValue 是父组件响应式对象的 value
// 无法被 watch 监听
const { formValue } = toRefs(props);
let data = ref<Bug>({} as Bug);
const updateData = () => {
data.value = props.formValue;
// 最后我使用 JSON 组合拳实现了拷贝,但我觉得在 vue3 中多少有点离谱
// 因为 vue2 都不会有这种问题
// data.value = JSON.parse(JSON.stringify(props.formValue));
};
watch(formValue, updateData);
顺便说一下这个使用场景,我有一个 Dialog
组件,里面封装好了一个表单,父组件传对象给 Props
,然后子组件拿到后在组件内部修改,修改过程不会影响父组件中原有对象,Dialog
提交表单后,会通过 emit
的方式返回修改的值
最近刚用上 vue3
还不是很懂
直接
watch
组件的props
对应的属性即可,props
本身是一个reactive
,如果某个属性是个对象,它会被Proxy
深度代理,想要防止相同的引用则需要深拷贝(如果确定只有一层浅拷贝即可)