Vue 3 支持多个 v-model 绑定同一组件,需通过命名 prop(如 title)、update:xxx 事件及 defineProps/defineEmits 显式声明;Vue 3.4+ 可用 defineModel 简化代码。

多个 v-model 绑定在同一个组件上,本质是让组件同时响应并同步多个独立的数据源。Vue 3 原生支持这一能力,不需要额外插件或繁琐的 .sync 模拟,关键在于命名区分、事件匹配和 prop 声明对齐。
明确每个 v-model 对应的 prop 和事件
每个带参数的 v-model(如 v-model:title)会自动映射为:
- 一个同名 prop(如
title) - 一个
update:xxx自定义事件(如update:title)
子组件需显式声明这些 prop 并触发对应事件。例如:
<script setup><br>const props = defineProps(['title', 'content', 'published'])<br>const emit = defineEmits(['update:title', 'update:content', 'update:published'])<br></script>
模板中分别绑定内部元素
不要共用一个 v-model,而是按字段拆开绑定:
<template><br><input :value="title"><br><textarea :value="content"></textarea><br><input type="checkbox" :checked="published"><br></template>
注意:这里不用 v-model 写法,而是手动控制 :value + 事件触发,确保精准响应每个字段变化。
父组件使用时直接写多个 v-model
语法简洁清晰,语义明确:
<articleeditor> v-model:title="post.title"<br> v-model:content="post.content"<br> v-model:published="post.isPublished"<br>/></articleeditor>
等价于手动写:
<articleeditor> :title="post.title"<br> :content="post.content"<br> :published="post.isPublished"<br> @update:title="post.title = $event"<br> @update:content="post.content = $event"<br> @update:published="post.isPublished = $event"<br>/></articleeditor>
进阶:配合 defineModel 简化(Vue 3.4+)
如果使用较新版本,可大幅减少样板代码:
<script setup><br>const title = defineModel('title')<br>const content = defineModel('content')<br>const published = defineModel('published')<br></script><br><br><template><br><input v-model="title"><br><textarea v-model="content"></textarea><br><input type="checkbox" v-model="published"><br></template>此时 v-model="title" 会自动读写 title 字段,并在变更时触发 update:title,修饰符(如 .trim)也原生生效。









