微信小程序中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 相关文章推荐
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
May 14 Javascript
JS阻止用户多次提交示例代码
Mar 26 Javascript
JQuery基础语法小结
Feb 27 Javascript
每天一篇javascript学习小结(Array数组)
Nov 11 Javascript
JS+CSS3模拟溢出滚动效果
Aug 12 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
Dec 08 Javascript
vue.js 实现评价五角星组件的实例代码
Aug 13 Javascript
Vue中使用vux配置代码详解
Sep 16 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
Oct 14 Javascript
JSON的parse()方法介绍
Jan 31 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
May 09 Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
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实现图片旋转效果实例代码
2014/10/01 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
PHP实现一个限制实例化次数的类示例
2019/09/16 PHP
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
input type=file 选择图片并且实现预览效果的实例
2017/10/26 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
Python中的下划线详解
2015/06/24 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
python3中zip()函数使用详解
2018/06/29 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
python科学计算之narray对象用法
2019/11/25 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
会计岗位描述
2014/02/22 职场文书
保安队长职务说明书
2014/02/23 职场文书
社区党务公开实施方案
2014/03/18 职场文书
公司口号大全
2014/06/11 职场文书
2015年路政工作总结
2015/05/22 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书