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

Vue3中defineModel默认值与v-model更新异常问题

Vue3 中 defineModel 默认值与父组件 v-model 不同步问题

问题场景

当父组件的响应式变量初始值为undefined,子组件通过defineModel的default选项设置默认对象时,输入框的更新无法同步到父组件。

复现代码

父组件(App.vue)

<script setup>
import { ref } from 'vue';
import Comp from './Comp.vue';

const model = ref(); // 初始值为 undefined
</script>

<template>
  <Comp v-model="model" />
  <div>{{ model }}</div>
</template>

存在同步问题的子组件(Comp.vue)

<script setup>
const model = defineModel({
  default: {
    msg: '',
  },
});
</script>

<template>
  <div>
    <input type="text" v-model="model.msg" />
  </div>
</template>

可行解决方案

不在defineModel中配置default,而是手动判断并初始化父组件传递的响应式值:

修复后的子组件(Comp.vue)

<script setup>
const model = defineModel();
if (model.value === undefined) {
  model.value = { msg: '' };
}
</script>

<template>
  <div>
    <input type="text" v-model="model.msg" />
  </div>
</template>

问题根源

defineModel的default选项仅用于提供渲染阶段的临时默认值,不会修改父组件传递的原始响应式变量。当父组件传递undefined时,子组件会使用这个默认对象进行渲染,但该对象是独立于父组件变量的副本——对model.msg的修改只会作用在这个副本上,无法同步回父组件。

而手动赋值model.value = { msg: '' }的方式,是直接更新了父组件的响应式引用(将父组件的ref值从undefined替换为新对象),后续对model.msg的修改都会作用在这个共享对象上,从而实现父子组件的双向数据同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:18:16