![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=1739599978-h5LhY7xTOWbbG6BLH0DXBp04GAEaFLIg-0-549e0d78ea93f5788c337930b59eedee)
先不使用v-model指令,按照以前的写法可以使用v-bind属性绑定的形式,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P28_9442.jpg?sign=1739599978-oF1FdpuyLma7CEPYkdyDZSYDQdJdRXys-0-06030c581d11c69f64c9d9ceb67d53d7)
使用v-bind属性绑定的形式,可以把msg数据渲染出来,但是当修改文本框中的内容时,M层数据不会改变,如图1-9所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_7118.jpg?sign=1739599978-vzXWcXblXu4x7E6cVH3OMG2VWPB8bFQH-0-b3ee91d60eaba8c2c9c84e4dfab270fa)
图1-9 h1标签渲染结果1
此时将文本框的值修改成“Hello Vue”,但插值表达式渲染出来的仍然是“Hello World”,说明M层的数据并没有随着V层数据的改变而改变,正确的代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_9444.jpg?sign=1739599978-hEKh9HPbRlAGRjwrJjEPymFFgOmMyDfw-0-d07b2df67b026c4abd6e03661bdccd5f)
使用v-model代替v-bind,当文本框的值修改成“Hello Vue”时,插值表达式的渲染结果也同时修改成“Hello Vue”,如图1-10所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_7122.jpg?sign=1739599978-s42pRx20r2SzYS5CpxcRKcIY69k8ewb0-0-e32944b45b01025debf57988d6e57ee2)
图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=1739599978-v3rWZMAtWwhRgKFJ6rB6tLOFeyAx26rM-0-52d1398ecdd6d3acb2c7c9496656c536)
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9449.jpg?sign=1739599978-gVYAUVT41GMCl5C6k4ILC313kabX3Rgb-0-d413c3f98108457bd974ddf3af09dffd)
常用的修饰符还有过滤首尾空格“.trim”,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9451.jpg?sign=1739599978-mO4NjZBtN4IC6t3z9oX2z0d4yu9SlDzZ-0-c1d0cae2ad0203839864fcf11c89655f)
本节最后一个知识点是.lazy修饰符的使用,其表示内容发生变化,并且在失去焦点时触发,代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9453.jpg?sign=1739599978-KsfD1g3KY54J1oVMbjKyh7UdxDBD3MHM-0-6c10fa1f6ee39673ffdb4b2eaaa57760)
当文本框的值发生变化时,插值表达式的渲染结果并不会立即改变,而是要等到文本框失去焦点后才改变,如图1-11所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_3529.jpg?sign=1739599978-mYiPCEipPJRFlb8akmeQZSLvLoVuz6tZ-0-d4e86af0f08386ff93fc9e4f4fd9aa1f)
图1-11 插值表达式渲染结果
1.7.2 使用v-model实现计算器案例
本节使用v-model实现简单的计算器功能,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_9455.jpg?sign=1739599978-94nfjafo8vH2aCE6OEVaeRqBND1w9mpb-0-6f2a428a9527094a50dffb7649996129)
运行代码,计算器效果如图1-12所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_5254.jpg?sign=1739599978-ZAlJ1GAwYYiZdv9lWzzgQkF3iR7CESAm-0-7cacccc7ec6acf38bee7806276b95f2c)
图1-12 计算器前端效果图
M层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_9457.jpg?sign=1739599978-rhJSb74V7OyWJBg5kdiwhpCHgktRW91o-0-b7115b14e3bb50d704b22f99d19dffd6)
代码解析如下。
(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=1739599978-Zn6t3FlQzqfOLYsleTJYnm7BnoHv7L1t-0-908f5dfa18ea0943c5d3e5c92ec19de2)
图1-13 打印vm实例对象
打印vm实例对象发现,btn方法和num1、num2等属于平级关系,所以在btn方法中使用num1、num2时,需要使用this.num1、this.num2。