v-model 是 Vue.js 中用于实现表单元素和数据之间双向绑定的指令。其工作原理如下:
1. 基本概念
v-model 将表单元素的 value 属性与 Vue 实例的数据属性绑定,并在输入时自动更新数据。
2. 实现原理
v-model 本质上是语法糖,结合了 v-bind 和 v-on:
v-bind: 将数据绑定到表单元素的value属性。v-on: 监听输入事件,更新数据。
例如:
ini
<input v-model="message">
等价于:
ini
<input :value="message" @input="message = $event.target.value">
3. 不同表单元素的处理
v-model 会根据不同的表单元素自动适配:
- 文本输入框 (
<input type="text">) : 使用value属性和input事件。 - 复选框 (
<input type="checkbox">) : 使用checked属性和change事件。 - 单选按钮 (
<input type="radio">) : 使用checked属性和change事件。 - 下拉菜单 (
<select>) : 使用value属性和change事件。
4. 自定义组件中的 v-model
在自定义组件中,v-model 默认使用 value 作为 prop,input 作为事件。可以通过 model 选项自定义 prop 和事件名。
例如:
ini
Vue.component('custom-input', {
props: ['value'],
template: `
<input
:value="value"
@input="$emit('input', $event.target.value)"
>
`
});
5. Vue 3 中的变化
Vue 3 中,v-model 的默认 prop 改为 modelValue,事件改为 update:modelValue,并支持多个 v-model 绑定。
例如:
ini
app.component('custom-input', {
props: ['modelValue'],
template: `
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
>
`
});
总结
v-model 通过 v-bind 和 v-on 实现双向绑定,自动适配不同表单元素,并在自定义组件中提供灵活的 prop 和事件配置。