微信小程序中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复选框CHECKBOX全选,取消全选
Aug 30 Javascript
JQuery的Alert消息框插件使用介绍
Oct 09 Javascript
基于jQuery的360图片展示实现代码
Jun 14 Javascript
JavaScript中的Truthy和Falsy介绍
Jan 01 Javascript
jquery实现二级导航下拉菜单效果
Dec 18 Javascript
jQuery Mobile和HTML5开发App推广注册页
Nov 07 Javascript
Angular学习教程之RouterLink花式跳转
May 03 Javascript
vue使用echarts图表的详细方法
Oct 22 Javascript
setTimeout与setInterval的区别浅析
Mar 23 Javascript
jquery登录的异步验证操作示例
May 09 jQuery
Vue实现微信支付功能遇到的坑
Jun 05 Javascript
JS实现网站吸顶条
Jan 08 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
php常用图片处理类
2016/03/16 PHP
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
node使用Mongoose类库实现简单的增删改查
2018/11/08 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
对于Python中线程问题的简单讲解
2015/04/03 Python
Django中url的反向查询的方法
2018/03/14 Python
使用CSS3 制作一个material-design 风格登录界面实例
2016/12/12 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
大学生创业计划书的格式要求
2013/12/29 职场文书
项目计划书范文
2014/01/09 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
新课程改革心得体会
2016/01/22 职场文书