vue2,3中的v-model
Vue2 与 Vue3 v-model
区别及实现原理分析
以下从 语法差异、实现原理 和 使用场景 三个角度深入分析,并提供代码示例。
一、Vue2 的 v-model
实现
1. 默认行为:
- 绑定属性: 隐式绑定组件的
value
- 监听事件: 隐式监听
input
事件 - 编译后代码:
<input v-model="message"> <!-- 编译为 ↓ --> <input :value="message" @input="message = $event.target.value">
2. 自定义组件:
- 需通过
model
选项自定义绑定属性和事件:// 子组件 export default { model: { prop: 'checked', // 绑定属性名 event: 'change' // 事件名 }, props: ['checked'], methods: { handleChange(e) { this.$emit('change', e.target.checked); } } }
3. 示例:
<!-- 父组件使用 -->
<CustomCheckbox v-model="isChecked" />
二、Vue3 的 v-model
改进
1. 默认行为变化:
- 绑定属性:
modelValue
- 监听事件:
update:modelValue
- 编译后代码:
<input v-model="message"> <!-- 编译为 ↓ --> <input :modelValue="message" @update:modelValue="newValue => message = newValue" >
2. 核心升级:
- 多
v-model
绑定: 可同时绑定多个数据<UserForm v-model:name="userName" v-model:age="userAge" />
// 子组件 props: ['name', 'age'], emits: ['update:name', 'update:age']
3. 示例:
<!-- 子组件 CustomInput.vue -->
<template>
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
>
</template>
<script setup>
defineProps(['modelValue']);
defineEmits(['update:modelValue']);
</script>
<!-- 父组件使用 -->
<CustomInput v-model="message" />
三、实现原理对比
特性 | Vue2 | Vue3 |
---|---|---|
默认绑定属性 | value |
modelValue |
默认事件 | input |
update:modelValue |
多v-model支持 | 不支持,需.sync 修饰符 |
原生支持 |
自定义配置 | 通过model 选项配置 |
直接通过参数指定 |
代码简洁性 | 需额外配置 | 语法更统一、灵活 |
四、原理深度解析
Vue2 响应式流程:
- 初始化阶段对数据进行劫持
- 模板编译时,将
v-model
转换为value
和input
监听 - 自定义组件的
model
选项在运行时动态修改绑定属性
Vue3 响应式流程:
- 基于 Proxy 的响应式系统
- 编译器将
v-model
分拆为modelValue
和update:modelValue
- 多个
v-model
生成对应的arg
(如v-model:title
→title
和update:title
)
五、最佳实践建议
- 表单元素: 优先使用原生
v-model
- 组件通信:
- Vue2 复杂场景使用
.sync
+v-bind
- Vue3 多数据流使用多
v-model
- Vue2 复杂场景使用
- 自定义组件:
// Vue3 组合式API const props = defineProps(['modelValue']); const emit = defineEmits(['update:modelValue']);
通过理解底层机制,可以更灵活地定制组件的数据流交互。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 分享4款.NET开源、免费、实用的商城系统
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库