微信小程序中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 相关文章推荐
Jquery 最近浏览过的商品的功能实现代码
May 14 Javascript
javascript禁用键盘功能键让右击及其他键无效
Oct 09 Javascript
jquery操作对象数组元素方法详解
Nov 26 Javascript
详解JavaScript逻辑And运算符
Dec 04 Javascript
详解JavaScript表单验证(E-mail 验证)
Mar 31 Javascript
jquery dataTable 获取某行数据
May 05 jQuery
关于Bootstrap按钮组件消除黄框的方法
May 19 Javascript
JavaScript实现换肤功能
Sep 15 Javascript
利用node实现一个批量重命名文件的函数
Dec 21 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
Jun 25 Javascript
JS实现灯泡开关特效
Mar 30 Javascript
JS数组方法slice()用法实例分析
Jan 18 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 8小时时间差的解决方法小结
2009/12/22 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
javascript GUID生成器实现代码
2009/10/31 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
javascript利用apply和arguments复用方法
2013/11/25 Javascript
jquery实现html页面 div 假分页有原理有代码
2014/09/06 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
vue组件的写法汇总
2018/04/12 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
Node 模块原理与用法详解
2020/05/13 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
python实现傅里叶级数展开的实现
2018/07/21 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
超市端午节活动方案
2014/01/23 职场文书
个人承诺书
2014/03/26 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
大学生党员承诺书
2014/05/20 职场文书
健康状况证明模板
2014/10/23 职场文书
工作年限证明模板
2014/11/01 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript