- 在 Vue 中,
v-model
是一个非常重要的指令,用于创建数据双向绑定。它在表单输入、选择器、复选框等表单控件元素上创建双向数据绑定,将表单上的值与应用状态绑定起来,实现视图与数据的自动同步。以下是关于v-model
的详细讲解:
基本用法
-
文本框:在
<input type="text">
元素上使用v-model
,可以将输入框的值与数据对象的属性进行绑定。例如:<input v-model="message" placeholder="输入内容">
这里
message
是 Vue 实例中的一个数据属性。当用户在输入框中输入内容时,message
的值会实时更新为输入框中的内容;反之,如果通过代码修改了message
的值,输入框中显示的内容也会相应更新。 -
复选框:对于单个复选框,
v-model
绑定的值通常是true
或false
。例如:<input type="checkbox" v-model="checked">
当复选框被勾选时,
checked
的值为true
;未勾选时,checked
的值为false
。如果是多个复选框绑定到同一个数组,那么数组中的元素对应被勾选的复选框的值。例如:<input type="checkbox" v-model="checkedNames" value="Alice"> <input type="checkbox" v-model="checkedNames" value="Bob">
这里
checkedNames
是一个数组,当勾选了值为 "Alice" 的复选框时,checkedNames
数组中会包含 "Alice" 这个元素。 -
单选按钮:
v-model
绑定的值是被选中的单选按钮对应的值。例如:<input type="radio" v-model="picked" value="One"> <input type="radio" v-model="picked" value="Two">
当用户点击第一个单选按钮时,
picked
的值会变为 "One";点击第二个单选按钮时,picked
的值会变为 "Two"。 -
选择框:对于
<select>
元素,v-model
绑定的值是被选中的<option>
的值。例如:<select v-model="selected"> <option disabled value="">请选择</option> <option>A</option> <option>B</option> <option>C</option> </select>
当用户在下拉菜单中选择某个选项时,
selected
的值会更新为该选项的值。
原理
v-model
本质上是语法糖,它背后做了两件事:
- 将输入框的值绑定到表达式的值上:通过
:value
指令实现。例如在<input v-model="message">
中,相当于<input :value="message">
,这样输入框的初始值会设置为message
的值。 - 为输入框添加一个事件监听器:当输入框的值发生变化时,会更新表达式的值。对于文本框,是监听
input
事件;对于复选框和单选按钮,是监听change
事件。例如在<input v-model="message">
中,相当于<input :value="message" @input="message = $event.target.value">
,当用户输入内容时,会触发input
事件,然后将输入框的值更新到message
中。
修饰符
v-model
还有一些修饰符可以用来定制行为:
-
.lazy:默认情况下,
v-model
在输入框内容变化时即刻更新数据。使用.lazy
修饰符后,会变为在change
事件触发时才更新数据。例如:<input v-model.lazy="msg">
这样只有当输入框失去焦点或用户按下回车键时,
msg
的值才会更新。 -
.number:自动将用户的输入值转换为数值类型。例如:
<input v-model.number="age">
即使用户输入的是字符串形式的数字,如 "18",
age
的值也会被转换为数值 18。 -
.trim:自动去除用户输入的首尾空白字符。例如:
<input v-model.trim="msg">
如果用户输入的是 " hello ",
msg
的值会被设置为 "hello"。
注意事项
- 避免在同一个元素上同时使用
v-model
和value
:因为v-model
本身就会绑定value
,如果同时使用可能会导致冲突。例如不要写<input v-model="message" :value="otherValue">
。 - 在自定义组件上使用
v-model
:在自定义组件上使用v-model
时,需要在组件内部通过props
接收外部传入的值,并通过$emit
触发事件来更新外部的值。例如:<!-- 父组件 --> <my-component v-model="parentValue"></my-component>
这样在子组件内部可以通过// 子组件 my-component export default { props: ['value'], methods: { updateValue(newValue) { this.$emit('input', newValue); } } }
this.value
获取到parentValue
的值,当需要更新parentValue
时,通过this.$emit('input', newValue)
触发事件,父组件中的parentValue
就会更新为newValue
。
v-model
是 Vue 中实现表单数据双向绑定的核心指令,通过它可以非常方便地将表单元素与数据进行绑定,使得数据的读取和更新更加直观和高效。