You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue子组件未触发事件却更新父组件变量的原因及解决方法

为什么父组件的userAccount会被更新

Vue 单向数据流的规则仅限制直接修改 props 本身的引用,比如你在子组件内直接执行props.account = 新对象这类操作时,才会触发 Vue 的 props 只读警告。而对于Object、Array这类引用类型的 props,修改其内部的嵌套属性、数组成员时,由于 props 的引用地址没有发生变化,Vue 不会做拦截校验。

你的代码中子组件AccountForm.vue的写法const record = ref(props.account),传入 ref 的是 props 中account对象的内存引用,因此record.value和父组件的userAccount、子组件的props.account本质指向同一个内存对象。你在子组件内通过 input 的 v-model 修改record.firstName、record.lastName时,实际修改的是这个共享对象的内部属性,父组件的对应变量自然会同步更新,这个现象和父子组件传值时是否使用 v-model 无关。

如何避免子组件修改同步到父组件

只需要在子组件初始化本地变量时,对传入的 props 对象做深拷贝,生成独立的副本即可,常用实现方案如下:

  • 如果是单层简单对象,可直接用展开运算符拷贝:
const record = ref({...props.account})
  • 如果是多层嵌套的对象,可使用浏览器原生的结构化拷贝方法:
const record = ref(structuredClone(props.account))
  • 对于结构复杂的对象,也可使用成熟工具库的深拷贝方法,比如 lodash 的cloneDeep:
import { cloneDeep } from 'lodash-es'
const record = ref(cloneDeep(props.account))

内容的提问来源于stack exchange,提问作者kodlik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:12:00