微信小程序中this.data与this.setData的区别详解


Posted in Javascript onSeptember 17, 2018

一、摘要

小程序中我们会经常使用到this.data与this.setData。其中this.data是用来获取页面data对象的,而this.setData是用来更新界面的。那么他们之间的区别与联系你真的搞懂了吗?

Page.prototype.setData()

setData 函数用于将数据从逻辑层发送到视图层,同时改变对应的 this.data 的值。

注意:

  • 直接修改 this.data 无效,无法改变页面的状态,还会造成数据不一致。
  • 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。

二、正文

this.data可以获取页面data对象,但是它返回的对象到底是新的对象还是仅仅只是一个引用呐。这个很关键,在日常开发中很可能因为不知道或者是自己的疏忽导致bug,而且很难排查原因。带着这个疑问我们来做一下试验。由于时间比较紧,博主就不单独写demo了,项目中可能有大量其它代码干扰我们分析,还请见谅。

var data = this.data.swiperItems[currentSwiper];

这行代码使用this.data获取了我需要的对象,并且赋值给data变量,下面分别打印data和this.data的相应对象。

微信小程序中this.data与this.setData的区别详解

可以看到这两个对象的内容是一致的。下面我将在data变量中添加一个test字段,然后再看这两者的打印结果。注意我并不会对this.data操作。

微信小程序中this.data与this.setData的区别详解

可以看到他们都发生了变换,所以这是浅拷贝,也就是两个变量指向了同一片存储区域,无论通过哪个变量操作这片存储区域,相应的两个变量得出的值都会变换。为了继续证明我们的猜想是正确的,下面我只操作this.data而不操作data。

微信小程序中this.data与this.setData的区别详解

跟我们预想的一样,即使我先赋值后加字段,data得出的结果也是被修改了的。

可能有人会问,那为啥用使用this.setData后才能看到界面的变换呢?至于this.setData我们可以看成是更新界面,并且貌似this.setData里面又托管了一个this.data的副本。因为在我改变this.data后立马去执行

this.setData({});

界面并不会更新,这就说明我们需要更新this.setData管理的那个数据对象才能更新界面,而界面真正加载的数据也是来自那里。想要知道具体怎么实现的,那就要去看源代码了。

三、结论

总结一下就是:this.data与this.setData的关系就是this.setData里面存储的是this.data的副本,而界面是从this.setData里面托管的this.data的副本取数据的。所以我们更改this.data并不会直接更新界面,因为这个时候的this.setData里面的副本还是没有更新前的。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jMessageBox 基于jQuery的窗口插件
Dec 09 Javascript
html+css+js实现xp window界面及有关功能
Mar 26 Javascript
css与javascript跨浏览器兼容性总结
Sep 15 Javascript
json实现前后台的相互传值详解
Jan 05 Javascript
JavaScript中的setUTCDate()方法使用详解
Jun 11 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
Sep 12 Javascript
jQuery旋转插件jqueryrotate用法详解
Oct 13 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
Dec 25 Javascript
基于cookie实现zTree树刷新后展开状态不变
Feb 28 Javascript
bootstrap table 多选框分页保留示例代码
Mar 08 Javascript
浅谈Vue父子组件和非父子组件传值问题
Aug 22 Javascript
原生js实现拖拽移动与缩放效果
Aug 24 Javascript
Puppet的一些技巧
Sep 17 #Javascript
详解JavaScript添加给定的标签选项
Sep 17 #Javascript
Element-ui tree组件自定义节点使用方法代码详解
Sep 17 #Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
Sep 16 #Javascript
在Vue-cli里应用Vuex的state和mutations方法
Sep 16 #Javascript
分享5个好用的javascript文件上传插件
Sep 16 #Javascript
vuex直接赋值的三种方法总结
Sep 16 #Javascript
You might like
php中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
window.onbeforeunload方法在IE下无法正常工作的解决办法
2010/01/23 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python 中文字符串的处理实现代码
2009/10/25 Python
利用python发送和接收邮件
2016/09/27 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
Python探索之创建二叉树
2017/10/25 Python
python 读写中文json的实例详解
2017/10/29 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
文史专业毕业生自荐信
2013/11/17 职场文书
员工培训邀请函
2014/01/11 职场文书
群教班子对照检查材料
2014/08/26 职场文书
网络营销实训总结
2015/08/03 职场文书