进行动态值绑定
在前一节的示例应用中,我们仅通过 v-model
就获得了单选按钮、复选框和选择选项的字符串或布尔值。我们可以通过使用 true-value
、false-value
和 v-bind
来修改这些默认值。下面我们来具体探讨。
替换布尔值 - 复选框元素
我们可以通过使用 true-value
和 false-value
为单选框元素绑定自定义值。例如,我们可以用 yes
替换默认的布尔值 true
,用 no
替换默认的布尔值 false
:
// src/components/dynamic-values.vue
<input
type="checkbox"
v-model="form.subscribe"
true-value="yes"
false-value="no"
>
export default {
data () {
return {
form: { subscribe: 'no' }
}
},
methods: {
checkForm (e) {
this.errors = []
if (this.form.subscribe !== 'yes') {
this.errors.push('必须订阅')
}
}
}
}
现在,当您将订阅输入的值发送到服务器时,会得到 yes
或 no
的响应。在 <script>
块中,我们现在将 no
声明为 subscribe
属性的初始值,并在 if
条件块中验证它,确保在点击提交按钮时始终为 yes
,否则将错误消息推送到 errors
数组中。
使用动态属性替换字符串 - 单选框元素
对于单选按钮 <input>
元素,我们可以通过 v-bind
将其值绑定到 Vue
实例中的动态属性:
// src/components/dynamic-values.vue
<input type="radio" v-model="form.gender" v-bind:value="gender.male">
export default {
data () {
return {
gender: {
male: 'm',
female: 'f',
other: 'o'
},
form: { gender: null }
}
}
}
当选择该单选按钮时,现在会获取到值 m
,其验证逻辑与之前保持一致。
使用对象替换字符串 - select 选项元素
我们还可以使用 v-bind
将非字符串值(如对象)绑定到表单输入元素。请看以下示例:
// src/components/dynamic-values.vue
<select v-model="form.favourite">
<option v-bind:value="{ title: 'On the Origin of Species' }">On the Origin of Species</option>
</select>
export default {
data () {
return {
form: {
favourite: null
}
}
}
}
当选择该选项时,typeof this.favourite
将返回 object
类型,而 this.favourite.title
的值为 "物种起源"。验证逻辑保持不变。
我们还可以结合 v-for
动态渲染 <option>
元素并绑定动态值:
// src/components/dynamic-values.vue
<select v-model="form.favourites" name="favourites_array[]" multiple>
<option v-for="book in options.books" v-bind:value="book.value">
{{ book.text }}
</option>
</select>
data () {
return {
form: { favourites: [] },
options: {
books: [
{ value: { title: '物种起源' }, text: '物种起源' },
{ value: { title: '时间简史' }, text: '时间简史' },
{ value: { title: '自私的基因' }, text: '自私的基因' }
]
}
}
}
现在我们不再需要硬编码 <option>
元素,可以从 API
等外部数据源动态获取 books
数据。
除了为表单输入绑定动态值外,我们还可以修改 v-model
在输入元素上的默认行为。例如,可以使用 change
事件替代默认的数据同步机制。我们将在下一主题中探讨具体实现方式。