v-model 是 v-bind 和 v-on 的语法糖,通过数据绑定与事件同步实现双向更新;其修饰符(.lazy/.number/.trim)改变默认事件或值处理逻辑,不同表单元素自动匹配合适属性与事件,自定义组件需支持 modelvalue prop 和 update:modelvalue 事件,且依赖响应式系统生效。

v-model 不是黑箱,它本质是 v-bind 和 v-on 的组合封装,靠显式的数据绑定 + 事件同步实现双向更新。理解这点,修饰符和自定义行为就自然清晰了。
修饰符怎么改默认行为?
修饰符不是魔法开关,而是让 Vue 在生成绑定逻辑时替换掉默认的属性名、事件名或做额外处理:
-
.lazy:把
@input换成@change,适合文本域或需要失焦才同步的场景 -
.number:在赋值前调用
parseFloat(),空字符串转为NaN,注意后续需判空 -
.trim:自动对输入值执行
.trim(),常用于用户名、搜索词等首尾空格敏感字段 - 多个可连用,例如
v-model.lazy.trim,Vue 会按顺序应用处理逻辑
不同表单元素,v-model 绑定的细节不一样
Vue 会根据标签类型自动匹配最合理的属性与事件组合:
-
<input type="text">和<textarea></textarea>:绑定:value+ 监听@input -
<input type="checkbox">和<input type="radio">:绑定:checked+ 监听@change -
<select></select>(单选/多选):绑定:value+ 监听@change
这种差异化设计贴合浏览器原生行为——比如复选框选中状态变化不频繁,用 change 更合理;而文本输入需实时响应,input 更合适。
自定义组件怎么支持 v-model?
Vue 3 要求组件明确接收 modelValue prop,并在值变更时触发 update:modelValue 事件:
- 父组件写法:
<myinput v-model="name"></myinput> - 子组件需声明:
props: ['modelValue'],内部通过this.$emit('update:modelValue', newValue)(Vue 2)或emit('update:modelValue', newValue)(Vue 3)通知父级 - 如需支持多个绑定,可用命名形式,例如
v-model:first-name对应firstNameprop 和update:firstName事件
底层响应式才是双向生效的前提
v-model 只负责“桥接”,真正驱动视图更新的是 Vue 的响应式系统:
- 数据必须定义在
data或ref/reactive中,否则 setter 不会被劫持 - 赋值语句如
msg = $event.target.value触发响应式 setter,进而通知依赖它的模板重新渲染 - 如果变量未初始化、拼错 key 名、或在非响应式对象上直接添加属性,v-model 就会“静默失效”——看起来绑定了,实际没反应
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











