小程序 ---- (setData关于赋值对象属性的问题)

一、什么是setData?

小程序的官方setData方法其实分为两个步骤:一是改变对应的 this.data的值;二是在步骤一的同时将数据从逻辑层发送到视图层。

我们先来了解一下小程序页面的一些底层关系:


小程序中各个页面是相互独立的,一个页面分为渲染层(视图层webview)、逻辑层(JavaScript)和系统层(底层)。
在架构上,视图层webview和逻辑层JavaScript是相互独立的,并不具备数据直接共享的通道。 换而言之,如果要将逻辑层中的data数据渲染到页面中,他们之间是无法直接通信的,往往需要系统层作为中间角色,而这个系统底层的方法,就是setData。

原理:当我们想操作数据,将数据渲染到视图层的时候,必须经过系统层。当系统层收到这个数据的同时,做了两件事:一是将数据传递给了逻辑层(通过JavaScriptCore);这个过程是同步的。 二是系统层把数据转发给视图层,然后视图层将数据渲染出来。这个过程是异步的 。
视图层和逻辑层的数据传输,实际上是通过两个层级的JavaScriptCore所实现。即用户传输的数据,需要将其转换为字符串的形式(JSON.stringify)传递。同时把转换后的数据内容拼接成一份JS脚本,再通过执行JS脚本的形式传递到两个层级的独立环境之中。

而,我们一般操作小程序里面的数据有两种方法:

  • this.setData({})
  • this.data.params

现在我们回过头来看开头的那两个步骤,我们可以理解为两个通道。在我们使用setData操作数据的时候,系统底层接收到数据之后,通道一用来同步逻辑层的数据;通道二用来发送数据给视图层。
需要注意的是,this.data.params这种设置数据的方法是同步的,而将数据从逻辑层发送到视图层这个步骤是异步的。所以如果直接修改 this.data.params 而不调用 this.setData方法,是无法改变页面的数据的,只会改变逻辑层(JavaScript)的数据,还会造成数据不一致。

接下来说说setData操作对象数据时候的一些坑。

二、错误的赋值

先在data里面定义好一个对象:

params: {name: '张三',age: '18',gender: 1
}

接下来我们修改一下张三的年龄,操作数据:

this.setData({params: {age: 20}
})

结果:除了年龄以外的数据全部被抹去,这种方式相当于是将params重新赋值,显然不可取。

//  params: {//   age: 20
// }

三、正确的赋值

正确的操作年龄数据如下:

this.setData({['params.age']: 20
})

结果:指定对象的某一个属性进行赋值,才不会影响到其他属性。

// params: {//   name: '张三',
//   age: 20,
//   gender: 1
// }

四、注意事项

基本上,除了操作对象的属性的时候,需要注意一下,操作其他数据类型则没有太多明显的坑。有的都已经罗列在下面了:

  1. 仅支持设置可JSON化的数据,如果不是 JSON 对象数据格式,需要将数据进行转化成json对象`,key:value形式;
  2. 不要把 data中任何一项的value设为undefined,否则这一项将不被设置并可能遗留一些潜在问题;
  3. 页面中需要显示的数据,可以挂载在data下面初始化,虽然这个值不一定要先设置,但是建议先声明然后在使用;
  4. 避免在同一时间内对setData的调用过于频繁(setData接口的调用涉及逻辑层与渲染层间的线程通信,通信过于频繁可能导致处理队列阻塞,界面渲染不及时而导致卡顿,应避免无用的频繁调用),建议每秒调用setData的次数不超过 20 次;
  5. 单次设置的数据不能超过1024kB(1M),不要一次设置过多的数据(由于小程序运行逻辑线程与渲染线程之上,setData的调用会把数据从逻辑层传到渲染层,数据太大会增加通信时间,会增加脚本的编译执行时间,占用 WebView JS 线程),setData的数据在JSON.stringify后不超过 256K;
  6. 避免 setData 数据冗余(setData操作会引起框架处理一些渲染界面相关的工作,避免将未绑定在 WXML 的变量传入setData,减少不必要的性能消耗);
  7. 后台态页面进行setData(比如退出小程序),当页面进入后台态(用户不可见),不应该继续去进行 setData,后台态页面的渲染用户是无法感受到的,另外后台态页面去 setData 也会抢占前台页面的执行;

小程序 ---- (setData关于赋值对象属性的问题)相关推荐

  1. 小程序setdata优化_微信小程序 setData的使用方法详解

    微信小程序 setData的使用方法详解 微信小程序 setData的使用方法详解 最近在使用微信小程序的setData时,遇到了以下问题.如下: 官网文档在使用setData()设置数组对象的某个元 ...

  2. 微信小程序setData 赋值对象属性

    这几天在做页面的时候,关于setData方法产生了一点疑问,现在来总结一下. 首先说一下赋值对象属性的两种方法 1.修改data下的对象 this.setData({'params.name':'李四 ...

  3. 微信小程序给数组、对象赋值

    微信小程序给数组.对象赋值 给定义的对象赋值://公司名称getCompanyNmae(e: any) {this.setData!({'where.companyName': e.detail.va ...

  4. 微信小程序————setData()方法的使用和注意事项

    微信小程序setData()使用: ##Page.prototype.setData(Object data, Function callback) setData 函数用于将数据从逻辑层发送到视图层 ...

  5. 微信小程序setdata方法

    微信小程序setdata方法 微信小程序中有时候需要从其他位置获取数据在前端调用 一般会用到小程序中封装好的setdata方法: /** `setData` 函数用于将数据从逻辑层发送到视图层*(异步 ...

  6. 微信小程序的如何使用全局属性 —— 微信小程序教程系列(5)

    微信小程序提供了app.js文件,用于放置一些全局的函数和全局的属性. 一般情况下,我都会把一些常用的函数和属性写在app.js文件内,这样不用在页面之间传值,或者不用重复加载. 下面以全局属性为例 ...

  7. 小程序中input赋值

    小程序:input赋值(扫一扫或手动输入获取) wxml <input value="{{inputValue}}" class="input" name ...

  8. 小程序setData原理

    小程序setData工作原理 小程序的视图层目前使用 WebView 作为渲染载体,而逻辑层是由独立的 JavascriptCore 作为运行环境.在架构上,WebView 和 JavascriptC ...

  9. 关于微信小程序textarea中的maxlength属性失效问题

    关于微信小程序textarea中的maxlength属性失效问题 代码菜鸡今天在编写小程序前端代码时,遇到了一个问题:textarea输入140个字以后,就再也输不进去了,想着设置一下maxlengt ...

  10. 微信小程序中,json对象与字符串相互转换

    微信小程序中,json对象转字符串,以及字符串转json对象,具体代码如下: //这是一个json对象 var jsonobj = {"orderId":"3308908 ...

最新文章

  1. 管理者和领导者有哪些区别?
  2. 红米手机使用应用沙盒一键修改imsi信息
  3. [个人博客作业Week7]软件工程团队项目感想与反思
  4. PDF文件使用指南(转载)
  5. 切换器黑屏_景阳华泰科技高清无缝矩阵切换器高端视频会议运用
  6. 判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验
  7. CentOS 7上搭建Spark 3.0.1 + Hadoop 3.2.1分布式集群
  8. mysql缺少函数_总结零散的 MySQL 基础知识
  9. PDF处理控件Spire.PDF热门问题解答
  10. html4音频插件,js音频插件audio.js
  11. 用Python玩人脸合成,你也能有一张明星脸(附代码)
  12. CAD交互绘制虚线(网页版)
  13. 温度对免疫代谢调节和癌症进展的影响
  14. 上海住房公积金账号系统及查询
  15. require.context()的用法
  16. java imageio temp_java-使用ImageIO.write jpg文件时出现问题:粉红色背景
  17. 笔记本显示器仅计算机,Nvidia X服务器设置仅显示1个屏幕(笔记本电脑+已连接外部显示器)...
  18. Python数据可视化之美
  19. c语言有50个学生,要求输出成绩在80分以上的学生的学号和成绩,输入50个同学的学号和成绩,输出其中80分以上的学号和成绩...
  20. 集成聚合火车票订票接口(回调推送方式)总结

热门文章

  1. 【目标跟踪】基于matlab帧差法结合卡尔曼滤波行人姿态识别【含Matlab源码 1127期】
  2. 【数字信号调制】基于matlab二进制差分相移键控调制(2DPSK)【含Matlab源码 163期】
  3. 【滤波器】基于matlab升余弦滤波器【含Matlab源码 993期】
  4. 【图像分割】基于matlab GUI阙值+边缘检测+区域法图像分割【含Matlab源码 817期】
  5. 【优化调度】基于matlab粒子群算法求解梯级水电站调度优化问题【含Matlab源码 767期】
  6. dis 密集光流_密集光流估计的自监督注意力机制
  7. opencv cv2.copyMakeBorder()函数详解
  8. 调优jvm需要修改什么文件_JVM性能调优:基本概念介绍
  9. tplink连接服务器失败_TPLINK无线路由WDS(桥接)设置方法图解教程 距离远增强wifi信号...
  10. Sublime Text3:显示/隐藏侧边栏快捷键 修改侧边栏颜色、字体大小