你问的是 v-model (不是 v-modal 吧 😄),我来帮你梳理一下 Vue2 和 Vue3 的 v-model 区别。
🔹 Vue 2 中的 v-model
- 
语法 <input v-model="msg">- 
v-model本质上是 语法糖,等价于:<input :value="msg" @input="msg = $event.target.value" >
 
- 
- 
在组件中的用法 - 
默认情况下, v-model会绑定到valueprop ,并监听input事件:<!-- 父组件 --> <my-input v-model="msg"></my-input> <!-- 子组件 --> <template> <input :value="value" @input="$emit('input', $event.target.value)"> </template> <script> export default { props: ['value'] } </script>
- 
如果想改 prop 名和事件名,需要用 model选项:export default { model: { prop: 'checked', event: 'change' }, props: ['checked'] }父组件就可以写: <my-checkbox v-model="isChecked" />
 
- 
🔹 Vue 3 中的 v-model
- 
语法 - 
仍然是语法糖,但和 Vue2 不同: <input v-model="msg">等价于: <input :modelValue="msg" @update:modelValue="msg = $event" >
 
- 
- 
在组件中的用法 - 
默认 prop 变成了 modelValue,事件名变成了update:modelValue:<!-- 父组件 --> <my-input v-model="msg"></my-input> <!-- 子组件 --> <template> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"> </template> <script> export default { props: ['modelValue'] } </script>
 
- 
- 
多 v-model支持- 
Vue3 可以在一个组件上用多个 v-model,通过参数区分:<user-name v-model:first-name="first" v-model:last-name="last" />子组件写法: export default { props: ['firstName', 'lastName'], emits: ['update:firstName', 'update:lastName'] }
 
- 
- 
修饰符传递 - 
Vue2 的修饰符(如 .trim、.lazy)只能在内置组件里生效;
- 
Vue3 可以让自定义组件接收修饰符: <my-input v-model.trim="msg" />子组件里通过第二个参数获取: export default { props: ['modelValue'], emits: ['update:modelValue'], setup(props, { emit, attrs }) { console.log(attrs['v-model-modifiers']); // { trim: true } } }
 
- 
🔑 总结对比
| 特性 | Vue2 | Vue3 | 
|---|---|---|
| 默认 prop | value | modelValue | 
| 默认事件 | input | update:modelValue | 
| 自定义 prop+事件 | model: { prop, event } | 直接用 v-model:xxx | 
| 多个 v-model | ❌ 不支持 | ✅ 支持 | 
| 修饰符传递 | ❌ 不支持(仅限原生表单) | ✅ 支持传递到子组件 |