![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=1739314183-ko9ni9A4eJzKnYfBpk4dSC5DmhWJwnt4-0-878e78bdab68f6abd07d3c6a4972c718)
先不使用v-model指令,按照以前的写法可以使用v-bind属性绑定的形式,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P28_9442.jpg?sign=1739314183-qIaAunyxtnYftXza9kkc1OjeyAhUmaS5-0-e59401efd87499f4989615ab118b536f)
使用v-bind属性绑定的形式,可以把msg数据渲染出来,但是当修改文本框中的内容时,M层数据不会改变,如图1-9所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_7118.jpg?sign=1739314183-1NCyvWQ9ZUjJm1Pch14ul1IpLKPYTlpj-0-7fc9119ae4e1eb96c354fc187aaf2a46)
图1-9 h1标签渲染结果1
此时将文本框的值修改成“Hello Vue”,但插值表达式渲染出来的仍然是“Hello World”,说明M层的数据并没有随着V层数据的改变而改变,正确的代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_9444.jpg?sign=1739314183-m0Md8z6fNaE0l8XAubLUkHso9xdk2z06-0-77a1b38d12b3f6351fbf2d2663f2b98f)
使用v-model代替v-bind,当文本框的值修改成“Hello Vue”时,插值表达式的渲染结果也同时修改成“Hello Vue”,如图1-10所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_7122.jpg?sign=1739314183-SM4VTZQObxMRWiEgOlclbAe3DvVeOgY5-0-96084cc722577abe9e1600faf81607fb)
图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=1739314183-lmu4P3pmnqjc5US6yS4h4JvFIC3rdgZA-0-9d6bf52b755cb62b7cf7c05587dbdd71)
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9449.jpg?sign=1739314183-lNjaMTALubxBpb4Nw4D2HR8CyJeIrHQL-0-43376f8527446a20ed5f9b6f814596ed)
常用的修饰符还有过滤首尾空格“.trim”,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9451.jpg?sign=1739314183-elJz8qsYbFa4MT90pG5xWvlgcxfAdyS6-0-251804bfa14c7947a126886230d50d4d)
本节最后一个知识点是.lazy修饰符的使用,其表示内容发生变化,并且在失去焦点时触发,代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9453.jpg?sign=1739314183-Crhjj5VYTO0J1idXsIX91CCWeF15p4C2-0-d3bfe06bc71ecff7f436e8507750131c)
当文本框的值发生变化时,插值表达式的渲染结果并不会立即改变,而是要等到文本框失去焦点后才改变,如图1-11所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_3529.jpg?sign=1739314183-alk2hMwPMwLmYAcEEDYntDsCnnenqY7Q-0-dc967102590a285de5787fa2adcc593e)
图1-11 插值表达式渲染结果
1.7.2 使用v-model实现计算器案例
本节使用v-model实现简单的计算器功能,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_9455.jpg?sign=1739314183-WzjKD78IbjpyownAacGJUhPP7MbapsRL-0-07f804036e997372406efe976cb73469)
运行代码,计算器效果如图1-12所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_5254.jpg?sign=1739314183-0kTuhahK2mTCCFX4T4ufMOu8yLMr3zDc-0-fae86b87ca4104dd0a5a6a2ccd788f5d)
图1-12 计算器前端效果图
M层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_9457.jpg?sign=1739314183-i4w9CYnFUhaumdECnCs1EWDWdnAHpFMP-0-6e4106b45e79082fd5e3fe9f95b4c890)
代码解析如下。
(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=1739314183-fDnAeZOsgCze19EtmcrSWzmCmLkKUlUW-0-15bc7e947f0c2d7799cdbd96150f9c85)
图1-13 打印vm实例对象
打印vm实例对象发现,btn方法和num1、num2等属于平级关系,所以在btn方法中使用num1、num2时,需要使用this.num1、this.num2。