正确使用 v-model 的关键是理解其为 :prop + @update:prop 的语法糖;vue 3 默认用 modelvalue + update:modelvalue,支持多参数绑定及 definemodel() 简化实现,vue 2 则用 value + input 兼容。

在自定义组件上正确使用 v-model,关键在于理解它不是魔法,而是 :prop + @update:prop 的语法糖。Vue 2 和 Vue 3 默认约定不同,而参数名决定了绑定哪一字段——用对名称、发对事件,双向绑定就自然成立。
Vue 3 默认方式:modelValue + update:modelValue
这是最常见场景。父组件写 <myinput v-model="searchText"></myinput>,子组件需:
- 声明
modelValueprop(类型与默认值按需设置,如{ type: String, default: '' }) - 用
defineEmits(['update:modelValue'])声明可触发事件 - 在输入、选择等时机调用
emit('update:modelValue', newValue) - 不要直接修改
props.modelValue,应通过事件通知父组件更新
例如:<input :value="modelValue"> emit('update:modelValue', e.target.value)">
带参数的 v-model:绑定多个字段
当组件需要同时控制标题、状态、标签等多个值时,用参数名区分:
- 父组件写
<articleeditor v-model:title="title" v-model:status="status"></articleeditor> - 子组件分别接收
title和statusprop - 分别触发
update:title和update:status事件 - 无需额外配置,Vue 自动识别参数并映射到对应事件
注意:参数名必须是合法标识符,不能含空格或特殊符号。
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
Vue 3.4+ 推荐:用 defineModel() 简化实现
这是目前最简洁的方式,适合单值绑定场景:
- 子组件中直接写
const model = defineModel() -
model.value就是绑定的数据,读写自动同步 - 可直接用于原生
v-model:<input v-model="model"> - 不用声明 props、不用 defineEmits、不用手动 emit
若需默认值或类型约束,可传入选项:defineModel({ type: String, default: 'hello' })
Vue 2 兼容写法:value + input(仅限旧项目)
如果仍在维护 Vue 2 项目,保持兼容性需注意:
- prop 名必须为
value,事件名必须为input - 子组件中
props: ['value'],触发this.$emit('input', newValue) - 不推荐在新项目中使用,因无法支持多 v-model,且已从 Vue 3 中移除
如需自定义绑定字段(比如用 checked 替代 value),Vue 2 可通过 model: { prop: 'checked', event: 'change' } 配置,但该选项在 Vue 3 中已被参数化 v-model 取代。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










