微信小程序中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 相关文章推荐
在Javascript中为String对象添加trim,ltrim,rtrim方法
Sep 22 Javascript
javascript 对象的定义方法
Jan 10 Javascript
jQuery学习2 选择器的使用说明
Feb 07 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
Dec 19 Javascript
PHP 数组current和next用法分享
Mar 05 Javascript
10条建议帮助你创建更好的jQuery插件
May 18 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
Sep 09 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
Sep 23 Javascript
使用plupload自定义参数实现多文件上传
Jul 19 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
Jul 08 jQuery
微信小程序开发注意指南和优化实践(小结)
Jun 21 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
Aug 03 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 高手之路(二)
2006/10/09 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
详解php反序列化
2020/06/10 PHP
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
Python实现的批量下载RFC文档
2015/03/10 Python
在Python中使用第三方模块的教程
2015/04/27 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
python开发之文件操作用法实例
2015/11/13 Python
python绘制双柱形图代码实例
2017/12/14 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
2014年高三毕业生自我评价
2014/01/11 职场文书
端午节活动策划方案
2014/03/09 职场文书
环境保护建议书
2014/08/26 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
丽江古城导游词
2015/02/03 职场文书
大学教师个人总结
2015/02/10 职场文书
单独二胎证明
2015/06/24 职场文书
python之基数排序的实现
2021/07/26 Python
sql注入教程之类型以及提交注入
2021/08/02 MySQL