Vue 的 v-model
实现了表单元素与数据的双向绑定。当数据变化时,视图自动更新;当用户通过视图修改内容时,数据也会同步变化。这种设计简化了表单交互的逻辑。
基础用法
<template>
<div>
<!-- 输入框与数据双向绑定 -->
<input v-model="message" placeholder="输入内容">
<p>你输入的内容是:{{ message }}</p>
<!-- 文本域 -->
<textarea v-model="text"></textarea>
<!-- 下拉选择 -->
<select v-model="selected">
<option value="A">选项A</option>
<option value="B">选项B</option>
</select>
</div>
</template>
<script>
export default {
data() {
return {
message: "",
text: "",
selected: "A"
};
}
};
</script>
处理复选框(Checkbox)
单个复选框(绑定布尔值)
<template>
<div>
<input type="checkbox" v-model="isChecked"> 是否同意
</div>
</template>
<script>
export default {
data() {
return { isChecked: false }
}
};
</script>
多个复选框(绑定数组)
<template>
<div>
<input type="checkbox" value="游泳" v-model="hobbies"> 游泳
<input type="checkbox" value="跑步" v-model="hobbies"> 跑步
<p>选择的爱好:{{ hobbies }}</p>
</div>
</template>
<script>
export default {
data() {
return { hobbies: [] } // 必须是数组
}
};
</script>
处理单选框(Radio)
<template>
<div>
<input type="radio" value="男" v-model="gender"> 男
<input type="radio" value="女" v-model="gender"> 女
</div>
</template>
<script>
export default {
data() {
return { gender: "男" }
}
};
</script>
修饰符(Modifiers)
.lazy
将同步时机从 input
事件改为 change
事件(输入框失去焦点时更新):
<input v-model.lazy="message">
.number
自动将输入值转为数字类型:
<input v-model.number="age" type="number">
.trim
自动去除首尾空格:
<input v-model.trim="username">
原理浅析
v-model
本质是一个语法糖,相当于同时使用 v-bind
和 v-on
。比如对于输入框:
<input
:value="message"
@input="message = $event.target.value"
>
等价于:
<input v-model="message">
自定义组件中使用
在自定义组件中,v-model
默认绑定 value
属性和监听 input
事件。例如:
<!-- 子组件 -->
<custom-input v-model="msg"></custom-input>
<!-- 等价于 -->
<custom-input
:value="msg"
@input="msg = $event"
></custom-input>
在子组件内部通过 props
接收和 $emit
触发:
// 子组件代码
export default {
props: ['value'],
methods: {
handleInput(e) {
this.$emit('input', e.target.value);
}
}
}