理解 v-model
v-model 是 Vue 的一个指令(内置的自定义 HTML 属性),用于在表单的 input、textarea 和 select 元素上创建双向数据绑定。通过将表单输入与 Vue 数据绑定,当用户与输入字段交互时,数据会自动更新。
需要注意的是:
-
v-model会忽略表单元素上设置的初始值,而将Vue数据视为唯一真实来源。因此,初始值应在Vue的data选项或函数中声明。 -
它会根据输入类型自动选择更新方式。例如:
-
在
type="text"的输入框上,会使用value属性和input事件实现双向绑定。
-
接下来的章节将详细解析该指令的具体应用场景。
在文本和 textarea 元素中使用 v-model
还记得我们在第 5 章《添加 Vue 组件》中使用 v-model 实现双向绑定创建自定义输入组件的内容吗?在该章的 "创建自定义输入组件" 部分,我们了解到 v-model 在输入框上的语法——<input v-model="username">——实际上是以下代码的简写形式:
<input
v-bind:value="username"
v-on:input="username = $event.target.value"
>
这个文本输入元素在底层做了两件事:
-
通过
v-bind:value绑定值属性,从处理程序username获取值 -
通过
v-on:input监听输入事件更新值
因此,自定义文本输入组件也必须始终在 model 属性中使用 value 属性和 input 事件,如下所示:
Vue.component('custom-input', {
props: {
value: String
},
model: {
prop: 'value',
event: 'input'
},
template: `<input v-on:input="$emit('input', $event.target.value)">`,
})
这种设计源于 v-model 的本质——由 v-bind:value 和 v-on:input 组合而成。同样的原理也适用于 textarea 元素:
<textarea v-model="message"></textarea>
这个 v-model textarea 元素是以下代码的简写:
<textarea
v-bind:value="message"
v-on:input="message = $event.target.value"
></textarea>
这个 textarea 输入元素,在幕后,绑定了 value 属性,该属性从处理程序 message 获取值,而 message 的值则来自 input 事件。因此,一个自定义的 textarea 组件也必须始终遵循 v-model textarea 元素的特性,在 model 属性中使用 value prop 和 input 事件,如下所示:
Vue.component('custom-textarea', {
props: {
value: null
},
model: {
prop: 'value',
event: 'input'
}
})
简而言之:
-
v-model在input输入框和textarea中始终绑定value属性 -
通过
input事件获取新值 -
自定义组件必须采用相同的属性和事件
那么 v-model 在复选框和单选按钮中又是如何工作的呢?我们将在下一节深入探讨。
在复选框和单选框元素中使用 v-model
另一方面,v-model 在复选框(checkbox)和单选按钮(radio button)输入元素上的实现机制有所不同。这些元素总是绑定 checked 属性,并通过 change 事件更新布尔值。例如:
<input type="checkbox" v-model="subscribe" value="yes" name="subscribe">
实际上等价于:
<input
type="checkbox"
name="subscribe"
value="yes"
v-bind:checked="false"
v-on:change="subscribe = $event.target.checked"
>
因此,自定义复选框组件也必须遵循相同的设计模式,在 model 属性中使用 checked 属性和 change 事件:
Vue.component('custom-checkbox', {
props: {
checked: Boolean,
},
model: {
prop: 'checked',
event: 'change'
}
})
同样的原理也适用于单选按钮:
<input type="radio" v-model="answer" value="yes" name="answer">
等价于:
<input
type="radio"
name="answer"
value="yes"
v-bind:checked="answer == 'yes'"
v-on:change="answer = $event.target.value"
>
因此自定义单选按钮组件也需要对应地实现:
Vue.component('custom-radio', {
props: {
checked: String,
value: String
},
model: {
prop: 'checked',
event: 'change'
}
})
简而言之:
-
对于复选框(
checkbox)和单选(radio)按钮,v-model始终绑定value属性 -
通过
change事件更新值 -
自定义组件必须采用相同的属性和事件
接下来,我们将在下一节探讨 v-model 在 select 选择框元素中的工作原理。
在 select 元素中使用 v-model
与预期一致,v-model 在 select 选择框元素中的实现机制也是通过绑定 value 属性,并在 change 事件中获取选中值。例如:
<select v-model="favourite" name="favourite">
<!-- 选项内容 -->
</select>
这实际上是以下写法的语法糖:
<select
v-bind:value="favourite"
v-on:change="favourite = $event.target.value"
name="favourite"
>
<!-- 选项内容 -->
</select>
因此,自定义选择框(checkbox)组件也必须遵循相同的设计模式,在 model 属性中使用 value 属性和 change 事件:
Vue.component('custom-select', {
props: {
value: String
},
model: {
prop: 'value',
event: 'change'
}
})
由此可见:
-
v-model本质上是v-bind和v-on的组合语法糖-
v-bind负责将值绑定到标记 -
v-on监听用户输入事件(可能是change或input事件)来更新数据
-
-
作为
Vue/Nuxt开发者,理解其底层原理至关重要
|
本节涉及的完整示例代码可在 |
既然我们已经了解了 v-model 指令在各种表单元素中的工作原理,接下来让我们在表单中使用这些元素,并在下一节中实现表单验证功能。