微信小程序中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 相关文章推荐
用document.documentElement取代document.body的原因分析
Nov 12 Javascript
JavaScript调用堆栈及setTimeout使用方法深入剖析
Feb 16 Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 Javascript
jsonp原理及使用
Oct 28 Javascript
jQuery实用函数用法总结
Aug 29 Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 Javascript
jQuery如何解决IE输入框不能输入的问题
Oct 08 Javascript
javascript遍历json对象的key和任意js对象属性实例
Mar 09 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
May 28 Javascript
layer页面跳转,获取html子节点元素的值方法
Sep 27 Javascript
将Vue组件库更换为按需加载的方法步骤
May 06 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
Jun 12 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
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
PHP网络操作函数汇总
2015/05/18 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
用console.table()调试javascript
2014/09/04 Javascript
javacript获取当前屏幕大小
2016/06/04 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
市政施工员自我鉴定
2014/01/15 职场文书
认购协议书范本
2014/04/22 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
任命书标准格式
2015/03/02 职场文书
小学国庆节活动总结
2015/03/23 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis
服务器nginx权限被拒绝解决案例
2022/09/23 Servers