微信小程序中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 BS,dialog控件自适应大小
Jul 06 Javascript
javascript:history.go()和History.back()的区别及应用
Nov 25 Javascript
js加强的经典分页实例
Mar 15 Javascript
js实现有时间限制消失的图片方法
Feb 27 Javascript
JavaScript 正则表达式中global模式的特性
Feb 25 Javascript
浅谈Sticky组件的改进实现
Mar 22 Javascript
jQuery侧边栏实现代码
May 06 Javascript
JS代码实现table数据分页效果
May 26 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
Dec 12 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
Jan 25 Javascript
JavaScript对象字面量和构造函数原理与用法详解
Apr 18 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
Aug 31 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 函数语法介绍一
2009/06/14 PHP
微信支付开发交易通知实例
2016/07/12 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
js数组去重的方法总结
2019/01/18 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
Python import自定义模块方法
2015/02/12 Python
Python实现设置windows桌面壁纸代码分享
2015/03/28 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
git进行版本控制心得详谈
2017/12/10 Python
Python assert语句的简单使用示例
2019/07/28 Python
python匿名函数的使用方法解析
2019/10/10 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
财务管理专业求职信
2014/06/11 职场文书
解放思想演讲稿
2014/09/11 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android