v-model 是 Vue 中实现双向数据绑定的核心指令,能够自动适配多种表单控件,例如 input、textarea、select、checkbox、radio 等,同时还支持 .lazy、.number、.trim 等修饰符,用来进一步优化表单输入与交互体验。不过在实际开发中需要注意,v-model 不要与 :value 或 @input 同时使用,并且所绑定的变量必须提前完成初始化。

v-model 是 Vue 中最常见、也最直观的双向绑定写法,通常只需一行代码,就能让表单输入框与数据状态保持实时同步——用户输入时,变量会自动更新;当变量值发生变化时,输入框中的内容也会立即同步显示。
基础写法:input、textarea、select 的 v-model 绑定方式很简单
只要确保绑定变量已经在 data(Vue 2)或 ref / reactive(Vue 3)中正确定义,就可以直接使用:
→ 绑定字符串类型数据,用户每输入一个字符,username 都会同步变化→ 多行文本输入同样适用,无需额外处理换行内容→ 自动获取当前选中项的 value 值,并赋值给变量
v-model 对不同表单元素的默认绑定行为
v-model 并不是对所有元素都使用同一种处理方式,而是会根据表单类型进行智能匹配:
- 单个
→ 通常绑定布尔值(true 代表选中) - 多个 checkbox 共用同一个 v-model → 一般绑定数组,选中的 value 会自动加入或移出数组
→ 通常绑定字符串,选中哪个单选项,就把对应的 value 赋给变量- 多选
→ 同样会绑定数组,多个被选中的 option 的 value 会组成一个数组
常用修饰符可以解决很多表单输入细节问题
通过添加修饰符,可以更灵活地控制 v-model 的行为,减少常见问题:
v-model.lazy→ 将数据更新时机从 input 切换为 change(通常在失焦后更新),适合搜索框等场景减少频繁触发v-model.number→ 自动执行 parseFloat,把 "123" 转换成数字 123,避免出现字符串拼接问题v-model.trim→ 自动去除输入内容前后的空格,表单校验前无需再手动调用 .trim()
使用 v-model 时必须注意的几个关键点
虽然写法简单,但如果细节处理不当,依然可能出现警告、数据异常或绑定失效:
- 不要同时使用
v-model和:value或@input,因为 v-model 本身已经封装了这两部分逻辑 - 在中文输入法拼音输入过程中(字符尚未上屏时),v-model 不会立即触发更新;如果需要实时监听,可改用
@input手动处理 - 绑定变量不能是 undefined 或 null,必须提前设置默认值,例如
username: ''、hobbies: []、agree: false
