首页 > 编程笔记 > JavaScript笔记
阅读:48
Vue v-model双向绑定详解(附带实例)
双向绑定是 Vue 中处理用户交互的一种方式,例如文本输入框、多行文本输入区域、单选框与多选框等都可以进行数据的双向绑定。
textarea 的数据绑定方式与 input 一样,示例代码如下:

图 1 输入多行文本
需要注意,textarea 元素只能通过 v-model 指令的方式来进行内容的设置,不能直接在标签内插入文本。例如下面的代码,text 变量的值将不会被显示在 textarea 中,因为它会被绑定的 textarea 变量所覆盖:
复选框通常成组出现,每个选项的状态只有两种:选中或未选中,如果只有一个复选框,在使用 v-model 指令进行数据绑定时,可以直接将其绑定为布尔值,示例代码如下:
很多时候复选框是成组出现的,这时我们可以为每一个复选框元素设置一个特殊的值,通过数组属性的绑定来获取每个复选框是否被选中,如果被选中,则数组中会存在它所关联的值,如果没有被选中,则数组中它所关联的值会被删除。示例代码如下:
运行代码,效果如下图所示:

图 2 进行复选框数据绑定
单选框的数据绑定逻辑与复选框类似,对每一个单选框元素,我们都可以设置一个特殊的值,并将同为一组的单选框绑定到同一个属性中即可,同一组中的某个单选框被选中时,对应绑定的变量的值也会替换为当前选中的单选框的值。示例代码如下:

图 3 进行单选框数据绑定
HTML 中使用 select 标签来定义选择列表。如果是支持单选的选择列表,可以将其直接绑定到 Vue 组件的一个属性上,如果是支持多选的选择列表,则可以将其绑定到数组属性上。
支持单选的选择列表示例代码如下:
在 select 标签内部,option 标签用来定义一个选项,若要使选择列表支持多选操作,只需要为其添加 multiple 属性即可。示例代码如下:
之后,在页面中进行选择时,按住 command(control) 键即可进行多选,效果如下图所示:

图 4 进行选择列表数据绑定
在浏览器中要对列表项进行多选,可以在选中一个选项后,按住鼠标左键进行拖动。
lazy 修饰符的作用有些类似于属性的懒加载。当我们使用 v-model 指令对文本输入框进行绑定时,每当输入框中的文本发生变化时,都会同步修改对应的属性的值。
在某些业务场景下,我们并不需要实时关注输入框中文案的变化,只需要在用户输入完成后进行数据逻辑的处理即可,这时就可以使用 lazy 修饰符。示例代码如下:
number 也是一个常用的修饰符,默认情况下,输入框中输入的文案都会被处理为字符串类型的数据,如果我们需要将其转换为数值类型,则可以使用 number 修饰符,代码如下:
另一个非常强大的修饰符是 trim 修饰符,其作用是将绑定的文本数据的首尾空格去掉,在很多应用场景中,用户输入的文案都是要提交到服务端进行处理的,trim 修饰符处理首尾空格的特性可以为开发者提供很大的方便。示例代码如下:
文本输入框的双向绑定
文本输入框的数据绑定我们之前也使用过,使用 Vue 的 v-model 指令直接设置即可,非常简单,示例如下:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>表单输入</title> <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> </head> <body> <div id="Application"> <!-- 文本输入框,双向绑定 textField --> <input v-model="textField" /> <p>文本输入框内容:{{ textField }}</p> </div> <script> const { createApp, ref } = Vue; const App = { setup() { const textField = ref(""); return { textField }; // 暴露给模板 } }; createApp(App).mount("#Application"); </script> </body> </html>运行代码,当输入框中输入的文本发生变化时,我们可以看到段落中的文本也会同步发生变化。
多行文本输入区域的双向绑定
多行文本可以使用 textarea 标签来实现,textarea 可以方便地定义一块区域用来显示和输入多行文本,文本支持换行,并且可以设置最多可以输入多少文本。textarea 的数据绑定方式与 input 一样,示例代码如下:
<textarea v-model="textarea"></textarea> <p style="white-space: pre-line;">多行文本内容:{{textarea}}</p>在上述代码中,为 p 标签设置 white-space 样式是为了使其可以正常地展示多行文本中的换行效果,运行效果如下图所示:

图 1 输入多行文本
需要注意,textarea 元素只能通过 v-model 指令的方式来进行内容的设置,不能直接在标签内插入文本。例如下面的代码,text 变量的值将不会被显示在 textarea 中,因为它会被绑定的 textarea 变量所覆盖:
<textarea v-model="textarea">{{text}}</textarea>需要注意,如果不对 textarea 使用 v-model 进行数据绑定,则标签内的文本可以正常地显示在输入区域中,但是当用户修改了 textarea 中的输入文本后,更新后的文本就无法同步更新到对应变量中。
复选框与单选框的双向绑定
复选框为网页提供多项选择的功能,当将 HTML 中的 input 标签的类型设置为 checkbox 时,就会以复选框的样式进行渲染。复选框通常成组出现,每个选项的状态只有两种:选中或未选中,如果只有一个复选框,在使用 v-model 指令进行数据绑定时,可以直接将其绑定为布尔值,示例代码如下:
<input type="checkbox" v-model="checkbox"/> <p>{{checkbox}}</p>在上述代码中,checkbox 是定义为布尔类型的属性。运行上述代码,当复选框的选中状态发生变化时,对应的属性 checkbox 的值也会切换。
很多时候复选框是成组出现的,这时我们可以为每一个复选框元素设置一个特殊的值,通过数组属性的绑定来获取每个复选框是否被选中,如果被选中,则数组中会存在它所关联的值,如果没有被选中,则数组中它所关联的值会被删除。示例代码如下:
<input type="checkbox" value="足球" v-model="checkList"/>足球 <input type="checkbox" value="篮球" v-model="checkList"/>篮球 <input type="checkbox" value="排球" v-model="checkList"/>排球 <p>{{checkList}}</p>其中,checkList 是定义为数组类型的属性。当某个选项被选中时,会将对应 input 元素的 value 值存入数组中,如果取消了某个选项的选中状态,数组中也会对应将其 value 值移除。
运行代码,效果如下图所示:

图 2 进行复选框数据绑定
单选框的数据绑定逻辑与复选框类似,对每一个单选框元素,我们都可以设置一个特殊的值,并将同为一组的单选框绑定到同一个属性中即可,同一组中的某个单选框被选中时,对应绑定的变量的值也会替换为当前选中的单选框的值。示例代码如下:
<input type="radio" value="男" v-model="sex"/>男 <input type="radio" value="女" v-model="sex"/>女 <p>{{sex}}</p>其中,sex 是定义为字符串类型的属性。运行代码,效果如下图所示:

图 3 进行单选框数据绑定
选择列表的双向绑定
选择列表能够给用户提供一组选项进行选择,它支持单选,也支持多选。HTML 中使用 select 标签来定义选择列表。如果是支持单选的选择列表,可以将其直接绑定到 Vue 组件的一个属性上,如果是支持多选的选择列表,则可以将其绑定到数组属性上。
支持单选的选择列表示例代码如下:
<select v-model="select"> <option>男</option> <option>女</option> </select> <p>{{select}}</p>其中,select 是定义为字符串类型的属性。
在 select 标签内部,option 标签用来定义一个选项,若要使选择列表支持多选操作,只需要为其添加 multiple 属性即可。示例代码如下:
<select v-model="selectList" multiple> <option>足球</option> <option>篮球</option> <option>排球</option> </select> <p>{{selectList}}</p>其中,selectList 是定义为数组类型的属性。
之后,在页面中进行选择时,按住 command(control) 键即可进行多选,效果如下图所示:

图 4 进行选择列表数据绑定
在浏览器中要对列表项进行多选,可以在选中一个选项后,按住鼠标左键进行拖动。
3个常用的修饰符
在对表单进行数据绑定时,我们可以使用修饰符来控制绑定指令的一些行为。常用的修饰符有 lazy、number 和 trim。lazy 修饰符的作用有些类似于属性的懒加载。当我们使用 v-model 指令对文本输入框进行绑定时,每当输入框中的文本发生变化时,都会同步修改对应的属性的值。
在某些业务场景下,我们并不需要实时关注输入框中文案的变化,只需要在用户输入完成后进行数据逻辑的处理即可,这时就可以使用 lazy 修饰符。示例代码如下:
<input v-model.lazy="textField"/> <p>文本输入框内容:{{textField}}</p>运行上述代码,只有当用户输入完成,即输入框失去焦点后,段落中才会同步输入框中最终的文本数据。
number 也是一个常用的修饰符,默认情况下,输入框中输入的文案都会被处理为字符串类型的数据,如果我们需要将其转换为数值类型,则可以使用 number 修饰符,代码如下:
<input v-model.number="textField"/> <p>文本输入框内容:{{textField}}</p>
另一个非常强大的修饰符是 trim 修饰符,其作用是将绑定的文本数据的首尾空格去掉,在很多应用场景中,用户输入的文案都是要提交到服务端进行处理的,trim 修饰符处理首尾空格的特性可以为开发者提供很大的方便。示例代码如下:
<input v-model.trim="textField"/> <p>文本输入框内容:{{textField}}</p>