使用 v-model 的双向绑定
Vue 通过创建专门监视 Vue 组件内部数据属性的指令,简化了实现双向数据绑定的方法。 当 Vue 正在观察的绑定数据属性发生变化时,Vue 指令 v-model 将做出响应性改变。该指令通常对于需要显示数据并响应式修改数据的 HTML 表单元素很有用,例如输入、文本区域、单选按钮等。
双向绑定是通过将 v-model
指令添加到要绑定的元素并引用 data 属性来实现的:
<template>
<input v-model="name" />
</template>
<script>
export default {
data() {
return {
name: ''
}
}
}
</script>
图 1.23 表示运行上述代码生成的输出:

请小心使用此指令,因为以这种方式绑定大量数据可能会影响应用程序的性能。考虑您的 UI 并将其拆分为不同的 Vue 组件或视图。本地状态中的 Vue 数据是可变的,可以在模板中的任何位置重新定义。
练习 1.07:使用 v-model 进行双向绑定
我们将使用 Vue 的双向数据绑定属性 v-model
构建一个组件。想想以双向方式绑定一条数据意味着什么。这种形式的数据模型的上下文通常是表单,或者是您期望输入和输出数据的地方。练习结束时,我们应该能够在表单上下文中使用 v-model
属性。
要访问本练习的代码文件,请访问 https://packt.live/2IILld8 。
-
打开命令行终端,导航到 Exercise1.07 文件夹,然后按顺序运行以下命令:
> cd Exercise1.07/ > code . > yarn > yarn serve
-
首先在模板区域内使用
v-model
编写绑定到name
data 属性的 HTML 标签和输入元素:<div class="form"> <label> Name <input type="text" v-model="name" /> </label> </div>
-
通过在
<script>
标记中返回名为name
的响应式数据属性来完成文本输入的绑定:<script> export default { data() { return { name: '', } }, } </script>
-
在模板区域内使用
v-model
制作与数据属性language
绑定的标签和可选 HTML 列表:<div class="form"> <label> Name <input type="text" v-model="name" /> </label> <label> Preferred javascript style <select name="language" v-model="language"> <option value="Javascript">JavaScript</option> <option value="TypeScript">TypeScript</option> <option value="CoffeeScript">CoffeeScript</option> <option value="Dart">Dart</option> </select> </label> </div>
-
在
<script>
标记中返回名为language
的响应式数据属性,完成选择输入的绑定:<script> export default { data() { return { name: '', language: '', } }, } </script>
-
在表单字段下方,使用大括号输出无序列表结构(
<ul>
和<li>
)内的名称和语言,例如{{ name }}
:将表单和显示区域包含在另一个标签(例如
<section>
标签)中,因为模板的根目录只能有一个 HTML 元素。您的代码应如下所示:
<template> <section> <div class="form"> <label> Name <input type="text" v-model="name" /> </label> <label> Preferred javascript style <select name="language" v-model="language"> <option value="Javascript">JavaScript</option> <option value="TypeScript">TypeScript</option> <option value="CoffeeScript">CoffeeScript</option> <option value="Dart">Dart</option> </select> </label> </div> <ul class="overview"> <li><strong>Overview</strong></li> <li>Name: {{ name }}</li> <li>Preference: {{ language }}</li> </ul> </section> </template>
-
在组件底部的
<style>
标记内添加样式,并将lang
属性设置为scss
:<style lang="scss"> .form { display: flex; justify-content: space-evenly; max-width: 800px; padding: 40px 20px; border-radius: 10px; margin: 0 auto; background: #ececec; } .overview { display: flex; flex-direction: column; justify-content: space-evenly; max-width: 300px; margin: 40px auto; padding: 40px 20px; border-radius: 10px; border: 1px solid #ececec; > li { list-style: none; + li { margin-top: 20px; } } } </style>
您的输出应如下所示:

你的表格应该看起来像这样。当您更新表单中的数据时,它也应该同步更新概览区域。
在本练习中,我们使用 v-model
指令将名称和 JavaScript-style 下拉选择绑定到本地状态的数据。当您更改数据时,它会响应性地更新我们将此绑定数据输出到的 DOM 元素。