Vue 3 原生支持多 v-model 绑定,通过命名(如 v-model:title)、事件匹配(update:title)和显式声明(defineProps/defineEmits)实现;Vue 3.4+ 可用 defineModel 进一步简化。

Vue 3 原生支持一个组件绑定多个 v-model,核心是靠“命名 + 事件匹配 + 显式声明”三者配合,不再需要 .sync 或手动写一堆 :prop 和 @update:xxx。
明确每个 v-model 对应的 prop 名和事件名
比如写 v-model:title,Vue 会自动:
- 把
title当作 prop 名传入子组件 - 监听子组件触发的
update:title事件
所以子组件必须显式声明这个 prop,并在值变化时发出对应事件。
子组件中正确声明和触发
用 defineProps 和 defineEmits 明确列出所有字段:
立即学习“前端免费学习笔记(深入)”;
使用 `@ainative/vue-sdk` 为 Vue 3 应用添加 AI 聊天功能。适用于以下场景:(1) 安装 `@ainative/vue-sdk`,(2) 在 Vue 组件中使用 `useChat` 组合式函数,(3) 提供……
defineProps(['title', 'content', 'status'])defineEmits(['update:title', 'update:content', 'update:status'])
模板里不要直接用 v-model 绑定内部元素(容易混淆来源),而是手动控制:
<input :value="title" @input="emit('update:title', $event.target.value)"><select :value="status" @change="emit('update:status', $event.target.value)">
父组件用法简洁直观
直接写多个带名的 v-model,语义清晰:
<ArticleEditor v-model:title="post.title" v-model:content="post.content" v-model:status="post.status" />
这行代码等价于手动传 prop + 监听事件,但更易读、不易漏写。
Vue 3.4+ 推荐用 defineModel 简化
如果项目已升级到 Vue 3.4 或更高版本,可用 defineModel 替代样板代码:
const title = defineModel('title')const content = defineModel('content')- 然后模板中直接
<input v-model="title">即可
它自动处理 prop 声明、事件触发和响应式代理,大幅减少重复逻辑。

















