vue双向实现数据
Vue 双向数据绑定的实现
Vue 通过 v-model 指令实现双向数据绑定,主要用于表单元素(如 input、select、textarea)与组件之间的数据同步。以下是具体实现方式:
表单元素的双向绑定
在表单元素上直接使用 v-model,Vue 会自动处理值的更新和事件监听:
<input v-model="message" placeholder="输入内容">
<p>输入的内容是: {{ message }}</p>
data() {
return {
message: ''
}
}
v-model默认绑定value属性并监听input事件。- 对于复选框和单选按钮,
v-model会绑定checked属性并监听change事件。
自定义组件的双向绑定
在自定义组件中实现 v-model,需要显式定义 model 选项或使用 v-bind 和 v-on:
方法 1:使用 model 选项
export default {
model: {
prop: 'value', // 绑定的属性名
event: 'input' // 触发更新的事件名
},
props: ['value'],
methods: {
updateValue(newValue) {
this.$emit('input', newValue);
}
}
}
方法 2:Vue 2.2+ 的语法糖
<custom-component v-model="message"></custom-component>
等价于:
<custom-component
:value="message"
@input="message = $event">
</custom-component>
方法 3:Vue 3 的多 v-model 支持
Vue 3 允许为组件绑定多个 v-model:
<user-name
v-model:first-name="firstName"
v-model:last-name="lastName">
</user-name>
组件内部通过 props 和 update 事件实现:
props: {
firstName: String,
lastName: String
},
emits: ['update:firstName', 'update:lastName']
修饰符
v-model 支持修饰符来优化数据绑定行为:
.lazy:将input事件改为change事件(延迟同步)。.number:自动将输入转为数字类型。.trim:自动去除首尾空格。
示例:
<input v-model.lazy="message">
<input v-model.number="age" type="number">
底层原理
Vue 的双向绑定本质是语法糖,结合了:
- 数据劫持:通过
Object.defineProperty(Vue 2)或Proxy(Vue 3)监听数据变化。 - 事件监听:在表单元素上监听
input或change事件,更新数据。 - 发布订阅:通过依赖收集和通知机制更新视图。
Vue 3 的响应式实现示例:

const data = { message: '' };
const proxy = new Proxy(data, {
set(target, key, value) {
target[key] = value;
console.log('数据已更新');
return true;
}
});






