![Vue.js核心技术解析与uni-app跨平台实战开发](https://wfqqreader-1252317822.image.myqcloud.com/cover/707/47216707/b_47216707.jpg)
1.7 双向数据绑定
本节讲解Vue中比较重要的一个指令—v-model双向数据绑定指令。双向数据绑定的概念如下。
(1)数据层(M层)发生变化会影响视图层(V层)改变。
(2)视图层(V层)发生变化会影响数据层(M层)改变。
下面开始v-model指令的学习。当前有这样一个需求,即把M层中的msg数据渲染到input文本框中,代码如下。
M层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P28_9440.jpg?sign=1738845557-iwtb6lCdVO7zgrx4HuBmtEZVe1x1cuf4-0-7cc0010f92f83ff3f0d13f1024db7743)
先不使用v-model指令,按照以前的写法可以使用v-bind属性绑定的形式,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P28_9442.jpg?sign=1738845557-ILIRCOsLqvsiqCKevgn4yGrs4iwYYl14-0-38411257730fba61c16580e374e58e28)
使用v-bind属性绑定的形式,可以把msg数据渲染出来,但是当修改文本框中的内容时,M层数据不会改变,如图1-9所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_7118.jpg?sign=1738845557-nxurLMJHtdwQ7qCEjUv52wpBhENHW4EN-0-6804df2b8f439e5bdffb337404e186a4)
图1-9 h1标签渲染结果1
此时将文本框的值修改成“Hello Vue”,但插值表达式渲染出来的仍然是“Hello World”,说明M层的数据并没有随着V层数据的改变而改变,正确的代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_9444.jpg?sign=1738845557-sVkaQfpWLIgk74fIe26dLUQUnuh9RcDp-0-ba452b41db6fc4a94262fd3b66dcfa2b)
使用v-model代替v-bind,当文本框的值修改成“Hello Vue”时,插值表达式的渲染结果也同时修改成“Hello Vue”,如图1-10所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_7122.jpg?sign=1738845557-Z8qrIChoRW7rotDYv5l7F1LtzInLXzgA-0-c550d6335bba928688f07d59c5b4a890)
图1-10 h1标签渲染结果2
注意:
v-model只能运用到表单元素,只有表单元素是用户可以操作的。
1.7.1 v-model修饰符
v-model还可以添加修饰符,例如数字修饰符“.number”,表示用户只能输入数字,代码如下。
M层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_9446.jpg?sign=1738845557-1R2FQBlq6eq22TGZRvZTC2dYhJ5cvqvF-0-74cc0ae45f61b803d2ec9e53d20328aa)
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9449.jpg?sign=1738845557-T1u1EeI1ggUcquhuL591Px57if7STR12-0-9664a4d14b6fc040b887a4727daa1307)
常用的修饰符还有过滤首尾空格“.trim”,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9451.jpg?sign=1738845557-ke0JNDWjVEUzTQKe0f97O6JpNpkMJTq9-0-061528f4804b5cfa659c63f88a7893e6)
本节最后一个知识点是.lazy修饰符的使用,其表示内容发生变化,并且在失去焦点时触发,代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9453.jpg?sign=1738845557-lVTU00VEhi8UNzoYJbL1yLy400oqhus6-0-aef8e1d7873a4117acc9be970a2d020f)
当文本框的值发生变化时,插值表达式的渲染结果并不会立即改变,而是要等到文本框失去焦点后才改变,如图1-11所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_3529.jpg?sign=1738845557-rzxGvNwshrAozgxfR4supFvXTFm2XjpW-0-bb3374f3cff5dd9f55c73b8a29e4b14f)
图1-11 插值表达式渲染结果
1.7.2 使用v-model实现计算器案例
本节使用v-model实现简单的计算器功能,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_9455.jpg?sign=1738845557-Sdk8qBwu0y6FOMKSGuORglnFHRTz31VJ-0-457a69677aaa9469399f2150caac7188)
运行代码,计算器效果如图1-12所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_5254.jpg?sign=1738845557-FmESLjr925rb4rEpOGf0ixMD5jRTElzC-0-b5f30f893a298a074088d79d9e22982f)
图1-12 计算器前端效果图
M层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_9457.jpg?sign=1738845557-Wzewk9t2perGvYG0Dr2eoUyYhPmozaR2-0-0b52d500c7de40e604cef272fffa5dae)
代码解析如下。
(1)视图层v-model定义的属性值必须在M层的data中定义,否则程序报错。
(2)btn方法在methods中定义。
(3)要点:btn方法中用到了data中的数据,如num1、num2、res,需要注意的是,在methods中调用data中的数据,必须要加this。
this表示当前的vm实例,在控制台中console.log(vm)打印的实例对象如图1-13所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P32_3541.jpg?sign=1738845557-W1OV6Iqi83yMmeJJ190AxlgfzQ4TQrYs-0-7d4540f0977ef137b5f4eafabbeaf281)
图1-13 打印vm实例对象
打印vm实例对象发现,btn方法和num1、num2等属于平级关系,所以在btn方法中使用num1、num2时,需要使用this.num1、this.num2。