Vue 3 中 v-model 可同时绑定多个属性,通过 v-model:xxx 语法或 Vue 3.4+ 的 defineModel 宏实现,分别对应显式事件契约与自动响应式 ref,支持独立修饰符与语义化状态管理。

Vue 3 中 v-model 可以同时绑定多个属性,核心在于利用 v-model:xxx 语法为不同 prop 显式指定绑定目标,每个绑定都遵循 “modelValue → update:modelValue” 的事件契约,只是把 modelValue 替换为自定义字段名(如 title、content)。
一、使用 v-model:xxx 实现多绑定(兼容所有 Vue 3 版本)
这是最通用的方式,不依赖新 API,适合 Vue 3.0–3.3 或需明确控制逻辑的场景:
- 子组件用
defineProps接收多个带默认值的 prop,例如title、content - 用
defineEmits声明对应更新事件:['update:title', 'update:content'] - 模板中分别绑定原生元素的属性,并在事件中触发对应
update:xxx事件 - 父组件通过
v-model:title="post.title"和v-model:content="post.content"同时使用
示例(子组件):
<template><input :value="title" @input="$emit('update:title', $event.target.value)" placeholder="标题">
<textarea :value="content" @input="$emit('update:content', $event.target.value)" placeholder="正文"></textarea>
</template>
<script setup>
const props = defineProps({
title: { type: String, default: '' },
content: { type: String, default: '' }
})
const emit = defineEmits(['update:title', 'update:content'])
</script>
二、使用 defineModel(Vue 3.4+ 推荐)
defineModel 是官方提供的宏,可为每个绑定字段生成响应式 ref,自动处理 prop 接收和事件派发,代码更简洁、修饰符也自动生效:
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
立即学习“前端免费学习笔记(深入)”;
- 调用
const title = defineModel('title')得到一个可读写的 ref,直接用于v-model="title" - 支持多个
defineModel并存,互不影响 - 修饰符(如
.number、.trim)会自动应用到对应绑定上
示例(子组件):
<script setup>const title = defineModel('title')
const content = defineModel('content')
</script>
<template>
<input v-model="title" placeholder="标题">
<textarea v-model="content" placeholder="正文"></textarea>
</template>
三、注意事项与常见搭配
多 v-model 不是“堆砌”,而是按业务语义组织状态。实际开发中常配合以下模式:
-
表单组件封装:一个编辑器组件同时暴露
v-model:title、v-model:status、v-model:tags - 父子通信解耦:避免把所有字段都塞进一个对象 prop,提升组件复用性和类型提示准确性
-
修饰符独立控制:比如
v-model:title.trim去空格,v-model:price.number转数字,互不干扰 -
不推荐混用:不要在一个组件里既用
defineModel()(默认 modelValue)又用defineModel('xxx'),易造成语义混乱

















