微信小程序中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 相关文章推荐
js 限制input只能输入数字、字母和汉字等等
Dec 18 Javascript
JS实现的数组全排列输出算法
Mar 19 Javascript
浅谈jQuery的offset()方法及示例分享
Jul 17 Javascript
jquery控制显示服务器生成的图片流
Aug 04 Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
Nov 26 Javascript
关于webpack代码拆分的解析
Jul 20 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
Nov 20 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
May 16 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
Dec 22 Javascript
vue基本使用--refs获取组件或元素的实例
Nov 07 Javascript
python实现迭代法求方程组的根过程解析
Nov 25 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
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
深入理解Node.js的HTTP模块
2016/10/12 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
python中__call__方法示例分析
2014/10/11 Python
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
python+opencv实现动态物体追踪
2018/01/09 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
pytorch 共享参数的示例
2019/08/17 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
Django-imagekit的使用详解
2020/07/06 Python
蛋白质世界:Protein World
2017/11/23 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
超市仓管员岗位职责
2014/04/07 职场文书
2015年教师业务工作总结
2015/05/26 职场文书