v-model在自定义组件中实现双向绑定的核心是接收modelvalue prop并触发update:modelvalue事件;vue 3统一此机制,支持多v-model;vue 2兼容value/input或model选项;封装时需透传attrs并处理修饰符。

在 Vue.js 中,v-model 在自定义组件中实现双向绑定,核心是遵循 Vue 的约定:组件接收 v-model 绑定的值(默认为 modelValue prop),并在值变化时触发 update:modelValue 事件。Vue 3 的写法更统一,Vue 2 则需兼容 value prop + input 事件(或通过 model 选项自定义)。
Vue 3 中的标准实现方式
Vue 3 废除了 value + input 的隐式约定,统一使用 modelValue prop 和 update:modelValue 事件:
- 组件声明
props: ['modelValue'],接收绑定的值 - 内部用
v-bind:value="modelValue"(如用于<input>)或直接读取该 prop - 当用户输入、选择等操作发生时,调用
this.$emit('update:modelValue', newValue)(Options API)或emit('update:modelValue', newValue)(Composition API) - 父组件无需额外配置,
<myinput v-model="text"></myinput>即可自动同步
支持多个 v-model(v-model:xxx)
Vue 3 允许为不同 prop 声明多个 v-model,例如同时控制文本和启用状态:
使用 `@ainative/vue-sdk` 为 Vue 3 应用添加 AI 聊天功能。适用于以下场景:(1) 安装 `@ainative/vue-sdk`,(2) 在 Vue 组件中使用 `useChat` 组合式函数,(3) 提供……
- 子组件定义
props: ['modelValue', 'enabled'],并声明对应事件update:modelValue和update:enabled - 父组件可写作:
<mycomponent v-model="text" v-model:enabled="isActive"></mycomponent> - 这本质是语法糖,等价于:
<mycomponent :model-value="text" :enabled="isActive"></mycomponent>
Vue 2 的兼容写法(含自定义 model 选项)
Vue 2 默认监听 value prop 和 input 事件,但可通过 model 选项灵活定制:
- 基础写法:接收
props: ['value'],触发this.$emit('input', newValue) - 进阶写法:在组件选项中添加
model: { prop: 'checked', event: 'change' },则v-model将作用于checkedprop 并监听change事件 - 注意:Vue 2 不支持多个
v-model,需手动用:prop.sync或事件监听模拟
封装时的实用建议
让自定义组件真正“像原生一样好用”,需注意细节:
-
透传 attributes:在根元素上使用
v-bind="$attrs",使class、id、placeholder等自动生效 -
处理 .lazy/.number/.trim 修饰符:Vue 会把修饰符信息存入
$attrs(如$attrs['onUpdate:modelValue']包含修饰符逻辑),但通常由开发者自行判断是否响应(例如.lazy对应change而非input事件) - 保持类型一致性:避免在 emit 前对值做不可逆转换(如 trim 后未同步更新显示),否则会导致视图与模型错位
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










