![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=1739267056-g5HrQQkheu9GzXz7OxF1n0u0hrJbevLT-0-7cfe2bad3e6faab90eb987137b3cb8ac)
先不使用v-model指令,按照以前的写法可以使用v-bind属性绑定的形式,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P28_9442.jpg?sign=1739267056-HxAhJa254PBkU42iTr5NLjaXpmPiOtFT-0-fe93aec25c775b7df8f063b18e6b3dbc)
使用v-bind属性绑定的形式,可以把msg数据渲染出来,但是当修改文本框中的内容时,M层数据不会改变,如图1-9所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_7118.jpg?sign=1739267056-JWgo8YPc7RuST3AUjPjurHRbiCH9heod-0-a8ab9e7888b6782109519a8992941f85)
图1-9 h1标签渲染结果1
此时将文本框的值修改成“Hello Vue”,但插值表达式渲染出来的仍然是“Hello World”,说明M层的数据并没有随着V层数据的改变而改变,正确的代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_9444.jpg?sign=1739267056-fljcsMvZxzhxT7niluUWFeP2GshQwNQE-0-21a487d4bd75c0b0696801f1d41a6f29)
使用v-model代替v-bind,当文本框的值修改成“Hello Vue”时,插值表达式的渲染结果也同时修改成“Hello Vue”,如图1-10所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P29_7122.jpg?sign=1739267056-EuQnhYQIqweXDnqkfvRghhvREBAkMNJd-0-9b05a0c6377d9710b2e22f00737912ff)
图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=1739267056-tGagUbJspzRtd01e8kGnhZKswO3M2oFw-0-1503b41ecfa587cbee6931c9fc52f9f5)
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9449.jpg?sign=1739267056-qaooscJTYyREuyvuBodSTwLiXcd4RSTH-0-2d2dbf38694115f1f680374b28f60efb)
常用的修饰符还有过滤首尾空格“.trim”,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9451.jpg?sign=1739267056-RcHbEQIbQ8P7ypzUClfVHBxYXr4h3X58-0-f0459243093babddc7e79bb9e4623f3d)
本节最后一个知识点是.lazy修饰符的使用,其表示内容发生变化,并且在失去焦点时触发,代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_9453.jpg?sign=1739267056-7pRIjdevpTNo8ZH1iIBhrGS4qDpHVikp-0-5ea3372974d410149b5b6580e92f916e)
当文本框的值发生变化时,插值表达式的渲染结果并不会立即改变,而是要等到文本框失去焦点后才改变,如图1-11所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P30_3529.jpg?sign=1739267056-3cRhFZJxeht6g5Rmx6y5wx883DU73eKb-0-e4e1bf0f03c5baaf44b5ba315a6af0d1)
图1-11 插值表达式渲染结果
1.7.2 使用v-model实现计算器案例
本节使用v-model实现简单的计算器功能,代码如下。
视图层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_9455.jpg?sign=1739267056-cQhJz1e8IoE89Z6ZOERsJ2hY6fAXaMzH-0-29fa55a66e2874217b1ed9376bb510cd)
运行代码,计算器效果如图1-12所示。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_5254.jpg?sign=1739267056-hgAtnOY6U9C8ndJAAMzAK2mO96RJ3ic1-0-3bd111981ba7846832e8060289b835de)
图1-12 计算器前端效果图
M层代码如下。
![](https://epubservercos.yuewen.com/F2C35D/26581507309218206/epubprivate/OEBPS/Images/Figure-P31_9457.jpg?sign=1739267056-0bg7Nv65oUsWi2Pa4pAJEStWyCqgI5FE-0-eb63576bef6b470574ac9c285b159204)
代码解析如下。
(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=1739267056-rYeVUeVdhFG7TQCS0K367MoioaWDTv8S-0-7179b1560b4d392895a78f7788966e33)
图1-13 打印vm实例对象
打印vm实例对象发现,btn方法和num1、num2等属于平级关系,所以在btn方法中使用num1、num2时,需要使用this.num1、this.num2。