如果解决小程序1024kb渲染之坑
问题:
- 在小程序开发中如果有那么个场景和操作步骤,获取商品下拉列表商品列表data为goodsList
- 当从后台获取数据response.data.list,通常我们会setData({goodsList:response.data.list})
- 下拉获取到第二页数据,添加goodsList里来,再次setData一次goodsList(是的小程序直接添加进当前数组,再次setData就能渲染出来,不用生成新数组,这里不用vue3.0之前把呢不能和react那样),
const goodObject = {
goodName:'小苹果'
}
this.data.goodsList.push(goodObject);
const goodsList = this.data.goodsList
this.setData({
goodsList
})
或者数组合拼新数组
cosnt goodsList = this.data.goodsList
cosnt newGoodsList = response.data.list
this.setData({
goodsList:[...goodsList,...newGoodsList]
})
看似没问题 ,实则再不同机型会有兼容问题,但是这个不是我要讲的,我要讲的是更深的坑,好吧,我们开始吧
小程序有讲
setData
函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的this.data
的值(同步)。
Object
以 key: value
的形式表示,将 this.data
中的 key
对应的值改变成 value
。
其中 key
可以以数据路径的形式给出,支持改变数组中的某一项或对象的某个属性,如 array[2].message
,a.b.c.d
,并且不需要在 this.data 中预先定义。
注意:
- 直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致。
- 仅支持设置可 JSON 化的数据。
- 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
- 请不要把 data 中任何一项的 value 设为
undefined
,否则这一项将不被设置并可能遗留一些潜在问题。
当我们每次下拉分页,其实是将所有累计的每页数据一次setData的,那么理论上来说,迟早会超过1024Kb,如果数据里img字段而且还是二维码base64字符串,那没几页就会超过1024,此时就会报错
试了很多方法,最终还是没解决。。。。
‘
’‘
’
‘’
当我要放弃的时候,突然灵光一下,才明白小程序团队的用心良苦,如果数据越大,渲染越吃力,那开发者们开发出的小程序变慢,那人们第一时间吐槽的就是小程序底层引擎有多垃圾,而不是骂当前小程序应用有多垃圾于是小程序开发团队才会设置这样一个阈值1024kb。那么既然它有设置这样的阈值,就有相应的处理方案吧,可惜官网给出的方案太直白,直白的让人无法理解
官方文档说:请尽量避免一次设置过多的数据
好,然后让我们避免一次设置过多的数据,那我们怎么把过的数据渲染呢,少部分少部分的来设置?怎么设置呢?
我就不一一罗列我试过的方法了,直接给大家说一个很灵验得方法把
如果我们有个数组100个长度就到达1024kb,那就把数组拆分设置setData,拆多大呢?只要小于1024就行。
而且次数不影响相率,那我们就挨个渲染。为了代码的可拓展。最终给大家一个万能的方案
当我们组装好我们的goodsList的时候,挨个设置,挨个去渲染!
cosnt oldList = this.data.goodsList
cosnt newGoodsList = response.data.list
const goodsList = [...newGoodsList,...oldList]
for(let i in goodsList){
this.setData({
['goodsList['+i+']']: goodsList[i]
})
}
Object
以 key: value
的形式表示,将 this.data
中的 key
对应的值改变成 value
。
总之遇到i一个数组就这样吧,不会有潜在bug了。
for(let i in goodsList){
this.setData({
['goodsList['+i+']']: goodsList[i]
})
}
现在是凌晨快3点了,还在等运维上线,我也是醉了,好了 就这样吧!
如果解决小程序1024kb渲染之坑的更多相关文章
- 小程序onLaunch事件的坑
记一个小程序踩过的坑 小程序项目中app.js里面定义了globalData,即全局变量,里面定义了一个token字段 需求是这样的,每次进入小程序的时候需要检验该token有没有,没有就请求后台获取 ...
- 微信小程序-列表渲染多层嵌套循环
微信小程序-列表渲染多层嵌套循环 入门教程之列表渲染多层嵌套循环,目前官方的文档里,主要是一维数组列表渲染的案例,还是比较简单单一,给刚入门的童鞋还是无从入手的感觉. <view wx:for= ...
- 开发微信小程序 中遇到的坑 及解决方法
1.wx.request 只能访问 https 解决: 新建项目 不填appid 即可访问 localhost 2.页面中多重三元表达式 解析有问题 解决: <!--{{index}} { ...
- 小程序textarea完美填坑
相信做微信小程序的码友们都被textarea这个原生组件坑过,什么placeholder位置错乱,穿透弹窗或遮罩层,ios上输入法弹起后换行输入内容遮挡,删除输入内容时内容被遮挡等等... 反正综上所 ...
- 微信小程序开发常见之坑
https://www.cnblogs.com/shunxing/articles/6971648.html input里的value会在浮层上面的,要解决这一问题还是很简单的,在小程序中input有 ...
- 小程序:web-view采坑指南
最近负责开发的[广州医保查询]小程序已经发布上线,其中使用web-view组件完成的[在线绑定社保卡]核心流程,遇到了一些坑,现总结如下: 首先,让我们一起看看什么是web-view ? 小程序api ...
- 微信小程序—setTimeOut定时器的坑
原文地址: http://fanjiajia.cn/2018/06/27/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E2%80%94setTimeOu ...
- 小程序红包开发跳坑记 微信小程序红包接口开发过程中遇到的问题 微信小程序红包开发
现在做小程序的越来越多,商家推广也是一个瓶颈,谁不发点红包,都很难找到人来用你的微信小程序了.于是不管你开发什么小程序功能,你或多或少都要用到小程序来发红包吧. 我们自己之前做公众号发红包,做了两三 ...
- 高大上的微信小程序中渲染html内容—技术分享
大部分Web应用的富文本内容都是以HTML字符串的形式存储的,通过HTML文档去展示HTML内容自然没有问题.但是,在微信小程序(下文简称为「小程序」)中,应当如何渲染这部分内容呢? 解决方案 wxP ...
随机推荐
- ASP.NET结合Redis实现分布式缓存
最近一个项目ASP.NET+MySQL 有的网页打开初始化的查询需要10秒甚至更久,用户体验极差,而且并发量变大的时候网站容易崩溃 后来想了两种解决方案都不是太满意 1.数据库里建一张缓存表,后台作业 ...
- oracle优化(一)
非原创 1. 选用合适的ORACLE优化器 ORACLE的优化器有3种: a. RULE(基于规则)b. COST(基于成本) c. CHOOSE(选择性) 选择缺省的优化器,可以通过对init.or ...
- Ruby http/net 中连接超时问题
下面在调用币安的接口时,经常会卡住,设置连接超时也不会抛出异常,代码如下(默认连接超时为nil, 参考:https://github.com/ruby/ruby/pull/269): require ...
- Mac 怎么通过自带终端连接linux服务器
简单来说,就两步骤 · 打开Mac终端,切换到root权限下 切换root权限: sudo -i ·通过ssh命令连接linux服务器 ssh root@127.0.0.1 root是账户名,@后面的 ...
- JAVA多线程之线程间的通信方式
(转发) 收藏 记 周日,北京的天阳光明媚,9月,北京的秋格外肃穆透彻,望望窗外的湛蓝的天,心似透过栏杆,沐浴在这透亮清澈的蓝天里,那朵朵白云如同一朵棉絮,心意畅想....思绪外扬, 鱼和熊掌不可兼得 ...
- Vue添加jquer插件
一.现象 综合开发需要,需要引用使用 二.解决 1.先安装jquer插件,命令运行: npm i jquery --save-dev (tips: i 也就是 install --save-dev ...
- 初始js闭包&事件的冒泡和捕获&EVENT对象
一.初识闭包 function a(){ var n = 0; this.inc = function () { n++; console.log(n); }; } var ...
- Python语言学习之Python入门到进阶
人们常说Python语言简单,编写简单程序时好像也确实如此.但实际上Python绝不简单,它也是一种很复杂的语言,其功能特征非常丰富,能支持多种编程风格,在几乎所有方面都能深度定制.要想用好Pytho ...
- VB中将类标记为可序列化
引用名空间: Imports SystemImports System.Runtime.Serialization 在类前加特性: <Serializable> 更多内容: https:/ ...
- [ES]elasticsearch章5 ES的分词(二)
Elasticsearch 中文搜索时遇到几个问题: 当搜索关键词如:“人民币”时,如果分词将“人民币”分成“人”,“民”,“币”三个单字,那么搜索该关键词会匹配到很多包含该单字的无关内容,但是如果将 ...