微信小程序中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 相关文章推荐
fromCharCode和charCodeAt 方法
Dec 27 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
Sep 19 Javascript
jQuery.each使用详解
Jul 07 Javascript
jquery form表单获取内容以及绑定数据
Feb 24 Javascript
Webpack打包慢问题的完美解决方法
Mar 16 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
Jul 20 jQuery
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
Nov 22 Javascript
Angular实现下拉框模糊查询功能示例
Jan 03 Javascript
JS运动改变单物体透明度的方法分析
Jan 23 Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 Javascript
浅析 Vue 3.0 的组装式 API(一)
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操作mysql数据库类
2014/12/08 PHP
浅析PHP文件下载原理
2014/12/25 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
python实现证件照换底功能
2019/08/20 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
三星印度官网:Samsung印度
2019/08/03 全球购物
Linux的主要特性
2016/09/03 面试题
建筑自我鉴定
2013/10/19 职场文书
高级人员简历的自我评价分享
2013/11/03 职场文书
应届生保险求职信
2013/11/11 职场文书
创业计划书的内容步骤和要领
2014/01/04 职场文书
学习标兵获奖感言
2014/02/20 职场文书
岗位职责说明书
2014/05/07 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
Python语言内置数据类型
2022/02/24 Python
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python