微信小程序中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客户端将指定区域导出到Word、Excel的代码
Oct 22 Javascript
jQuery实战之品牌展示列表效果
Apr 10 Javascript
JS简单实现登陆验证附效果图
Nov 19 Javascript
javascript遍历控件实例详细解析
Jan 10 Javascript
两种不同的方法实现js对checkbox进行全选和反选
May 13 Javascript
jQuery $.each遍历对象、数组用法实例
Apr 16 Javascript
JavaScript 继承详解(六)
Oct 11 Javascript
jQuery实现给input绑定回车事件的方法
Feb 09 Javascript
详解AngularJS controller调用factory
May 19 Javascript
详解基于 Node.js 的轻量级云函数功能实现
Jul 08 Javascript
刷新页面后让控制台的js代码继续执行
Sep 20 Javascript
Javascript查看大图功能代码实现
May 07 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中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
php实现爬取和分析知乎用户数据
2016/01/26 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
CSS和Javascript简单复习资料
2010/06/29 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
jQuery中each循环的跳出和结束实例
2017/08/16 jQuery
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
[43:51]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS Secret
2018/03/31 DOTA
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
Python异常处理知识点总结
2019/02/18 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
django 模型字段设置默认值代码
2020/07/15 Python
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
数控专业应届生求职信
2013/11/27 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
电工实训心得体会
2016/01/14 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
MySQL基于索引的压力测试的实现
2021/11/07 MySQL