微信小程序中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 判断字符串是否为数字的简单方法
Jul 25 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
Jun 06 Javascript
JS控制按钮10秒钟后可用的方法
Dec 22 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 Javascript
javascript事件冒泡简单示例
Jun 20 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
完美解决IE不支持Data.parse()的问题
Nov 24 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
Jul 25 Javascript
react-native之ART绘图方法详解
Aug 08 Javascript
详解vue项目首页加载速度优化
Oct 18 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
Dec 06 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制作静态网站的模板框架(三)
2006/10/09 PHP
PHP语法速查表
2007/01/02 PHP
PHP中ADODB类详解
2008/03/25 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
读jQuery之五(取DOM元素)
2011/06/20 Javascript
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
Vue实现左右菜单联动实现代码
2018/08/12 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
python比较两个列表大小的方法
2015/07/11 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
产品销售员岗位职责
2013/12/18 职场文书
初中体育教学反思
2014/01/14 职场文书
开业庆典策划方案
2014/02/18 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL