微信小程序:setData 数据传输长度为 1678 KB,存在有性能问题!

记录遇到的问题

本文也参考了其他文章

由于data 数据过大,比如 base64 / 数据列表返回内容过大,导致无法执行 setData功能。
这是因为setData设置的数据量是有限制的,单次设置的数据大小不得超过1024kb,否则就会出现如上错误。

问题做法:

data:{// 数据源list:[]
},getListData:function(){// 本次加载的数据let _list = [];...setData({// 将之前的数据与本次加载的数据合并后,一起提交list: this.data.list.concat(_list)});
}

改进后的做法:分页加载后,通过设置 list 指定位置的元素值,实现只提交新加载的数据,

data:{// 当前页数pageNo:0,// 数据源list:[]
},getListData:function(){// 本次加载的数据let _list = [];...setData({['list[' + pageNo + ']']: _list,});
}

注意:改进后方案中的 list 与常规方案中的 list 已经不是同种数组。

常规方案中的 list,是一维数组,直接存放 item,结构为:[{…},{…},{…},…]。

而改进方案中的 list 是二维数组,每个子元素为一页 item 数据的集合,而子元素数组中的每个元素才是 item 数据,结构为:[[{…},{…},{…}],[{…},{…},{…}],[{…},{…},{…}],…],所以需要注意对wxml中的列表结构进行修改。

==================
来看看 setData 是什么

setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)
Object 以 key: value 的形式表示,将 this.data 中的 key 对应的值改变成 value。
其中 key 可以以数据路径的形式给出,支持改变数组中的某一项或对象的某个属性,

注意:
1、直接修改this.data,而不调用this.setData(),是无法改变当前页面的状态的,会导致数据不一致/
2、仅支持可以JSON化的数据
3、单次设置的数据不能超过1024KB,尽量避免一次设置过多的数据/
4、不要把data中的任何一项的value设为undefined,否则这一项将不能被设置,可能会有潜在的问题

工作原理

小程序的视图层目前使用 WebView 作为渲染载体,而逻辑层是由独立的 JavascriptCore 作为运行环境。在架构上,WebView 和 JavascriptCore 都是独立的模块,并不具备数据直接共享的通道。当前,视图层和逻辑层的数据传输,实际上通过两边提供的 evaluateJavascript 所实现。即用户传输的数据,需要将其转换为字符串形式传递,同时把转换后的数据内容拼接成一份 JS 脚本,再通过执行 JS 脚本的形式传递到两边独立环境。

而 evaluateJavascript 的执行会受很多方面的影响,数据到达视图层并不是实时的。

常见的 setData 操作错误

1. 频繁的去 setData

在我们分析过的一些案例里,部分小程序会非常频繁(毫秒级)的去setData,其导致了两个后果:

Android 下用户在滑动时会感觉到卡顿,操作反馈延迟严重,因为 JS 线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层;
渲染有出现延时,由于 WebView 的 JS 线程一直处于忙碌状态,逻辑层到页面层的通信耗时上升,视图层收到的数据消息时距离发出时间已经过去了几百毫秒,渲染的结果并不实时;

2. 每次 setData 都传递大量新数据

由setData的底层实现可知,我们的数据传输实际是一次 evaluateJavascript 脚本过程,当数据量过大时会增加脚本的编译执行时间,占用 WebView JS 线程,

3. 后台态页面进行 setData

当页面进入后台态(用户不可见),不应该继续去进行setData,后台态页面的渲染用户是无法感受的,另外后台态页面去setData也会抢占前台页面的执行。

图片资源

目前图片资源的主要性能问题在于大图片和长列表图片上,这两种情况都有可能导致 iOS 客户端内存占用上升,从而触发系统回收小程序页面。

图片对内存的影响

在 iOS 上,小程序的页面是由多个 WKWebView 组成的,在系统内存紧张时,会回收掉一部分 WKWebView。从过去我们分析的案例来看,大图片和长列表图片的使用会引起 WKWebView 的回收。

图片对页面切换的影响

除了内存问题外,大图片也会造成页面切换的卡顿。我们分析过的案例中,有一部分小程序会在页面中引用大图片,在页面后退切换中会出现掉帧卡顿的情况。

当前我们建议开发者尽量减少使用大图片资源。

参考:https://blog.csdn.net/qq_38595560/article/details/81565925
https://zhuanlan.zhihu.com/p/181485977

微信小程序:setData 数据传输长度为 1678 KB,存在有性能问题!相关推荐

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

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

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

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

  3. 微信小程序setdata方法

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

  4. 微信小程序随机数(自定义长度和类型)

    微信小程序随机数(自定义长度和类型) random.js // random.jsconst charts = ['0', '1', '2', '3', '4', '5', '6', '7', '8' ...

  5. 微信小程序各种数据传输(云数据库、外接服务器、页面引用、全局变量等)

    微信小程序数据传输 数据传输流的种类 云开发数据传输 其他后台数据传输 当前页面数据传输 页面之间数据引用 页面之间数据传输 全局变量数据传输 不同数据传输之间的对比 数据传输流的种类 两个月前微信小 ...

  6. 微信小程序view动态长度_微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】...

    本文实例讲述了微信小程序实现动态改变view标签宽度和高度的方法.分享给大家供大家参考,具体如下: 1.效果展示 2.关键代码 index.wxml文件 >我是view标签,我现在的宽度是{{v ...

  7. 微信小程序view动态长度_微信小程序实现动态获取元素宽高的方法分析

    本文实例讲述了微信小程序实现动态获取元素宽高的方法.分享给大家供大家参考,具体如下: 我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuer ...

  8. 微信小程序setData注意事项,使用方法

    1..微信小程序开发中,为了减少data和视图层数据表现不一致,全部采用setData方法修改值. setData函数注意事项 1..直接修改 this.data 而不调用 this.setData ...

  9. 微信小程序的底层架构原理,及如何做性能优化

    双线程模型 微信小程序的框架包含两部分 View 视图层.App Service逻辑层.View层用来渲染页面结构,App Service层用来逻辑处理.数据请求.接口调用,它们在两个线程(Webvi ...

最新文章

  1. python 正则表达式 re.search() 的使用
  2. 【开发环境】010 Editor 工具 ( 工具下载 | 二进制文件分析模板模板安装 | 快捷键查看与设置 )
  3. svn: E200009
  4. 原子变量、volatile、synchronized的可见性和原子性比较
  5. LeetCode 919. 完全二叉树插入器(层序遍历队列)
  6. [essay]关机三天
  7. java使用zxing生成二维码
  8. SpringBoot2.1.5(33)---SpringBoot整合 Thymeleaf 模板引擎
  9. Futter基础第13篇: 实现Drawer侧边栏、以及侧边栏内容布局
  10. 闽江学院2015-2016学年下学期《软件测试》课程-第六次博客作业
  11. 项目设计报告可行性分析
  12. psp记忆棒测试软件,psp记忆棒修复工具 ms-format
  13. canvas视频录制
  14. 2019暑期金华集训 Day7 分治
  15. 上班族们都有哪些一直坚持的业余兴趣爱好?
  16. 服务器带宽打开网页很慢,网速快但是打开网页慢是怎么回事 浏览器打开网页慢的解决办法汇总...
  17. java 通话录音_Java 实现麦克风自动录音
  18. JedisNoReachableClusterNodeException: No reachable node in cluster
  19. 成年人英语速成指南(附资源及工具)
  20. C - error: converting to execution character set:Illegal byte sequence

热门文章

  1. Ubuntu系统中使用todesk设备ID不显示问题解决
  2. 对于uniapp的项目,获取设备的一些设备id,首次登陆设备的首台绑定,以及对项目的版本号进行对比进行app升级
  3. vmware虚拟机镜像制作成QCOW2
  4. 海康摄像机接入NVR后怎么会自动变成H.265
  5. 为什么电脑浏览器显示时钟快了_打开网站提示您的时钟快了_网页显示您的时钟慢了,解决方法...
  6. [异能程序员]第六章 遛狗(第二更)
  7. 个人新出的书籍---《云计算网络珠玑》
  8. 乐筑加速推进绿色建筑理念执行落地
  9. 深圳绿色建筑人才需求持续增长
  10. 无处不在_您的图片是病毒。 他们在互联网上无处不在