问题:

  • 在小程序开发中如果有那么个场景和操作步骤,获取商品下拉列表商品列表data为goodsList
  1. 当从后台获取数据response.data.list,通常我们会setData({goodsList:response.data.list})
  2. 下拉获取到第二页数据,添加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].messagea.b.c.d,并且不需要在 this.data 中预先定义。

注意:

  1. 直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致。
  2. 仅支持设置可 JSON 化的数据。
  3. 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
  4. 请不要把 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渲染之坑的更多相关文章

  1. 小程序onLaunch事件的坑

    记一个小程序踩过的坑 小程序项目中app.js里面定义了globalData,即全局变量,里面定义了一个token字段 需求是这样的,每次进入小程序的时候需要检验该token有没有,没有就请求后台获取 ...

  2. 微信小程序-列表渲染多层嵌套循环

    微信小程序-列表渲染多层嵌套循环 入门教程之列表渲染多层嵌套循环,目前官方的文档里,主要是一维数组列表渲染的案例,还是比较简单单一,给刚入门的童鞋还是无从入手的感觉. <view wx:for= ...

  3. 开发微信小程序 中遇到的坑 及解决方法

    1.wx.request 只能访问 https 解决: 新建项目  不填appid  即可访问 localhost 2.页面中多重三元表达式  解析有问题 解决: <!--{{index}} { ...

  4. 小程序textarea完美填坑

    相信做微信小程序的码友们都被textarea这个原生组件坑过,什么placeholder位置错乱,穿透弹窗或遮罩层,ios上输入法弹起后换行输入内容遮挡,删除输入内容时内容被遮挡等等... 反正综上所 ...

  5. 微信小程序开发常见之坑

    https://www.cnblogs.com/shunxing/articles/6971648.html input里的value会在浮层上面的,要解决这一问题还是很简单的,在小程序中input有 ...

  6. 小程序:web-view采坑指南

    最近负责开发的[广州医保查询]小程序已经发布上线,其中使用web-view组件完成的[在线绑定社保卡]核心流程,遇到了一些坑,现总结如下: 首先,让我们一起看看什么是web-view ? 小程序api ...

  7. 微信小程序—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 ...

  8. 小程序红包开发跳坑记 微信小程序红包接口开发过程中遇到的问题 微信小程序红包开发

    现在做小程序的越来越多,商家推广也是一个瓶颈,谁不发点红包,都很难找到人来用你的微信小程序了.于是不管你开发什么小程序功能,你或多或少都要用到小程序来发红包吧.  我们自己之前做公众号发红包,做了两三 ...

  9. 高大上的微信小程序中渲染html内容—技术分享

    大部分Web应用的富文本内容都是以HTML字符串的形式存储的,通过HTML文档去展示HTML内容自然没有问题.但是,在微信小程序(下文简称为「小程序」)中,应当如何渲染这部分内容呢? 解决方案 wxP ...

随机推荐

  1. ECMAScript 6

    参考网上其他帖子,整理如下   ES6 就是ECMAScript 6是新版本JavaScript语言的标准. 增加了如下   Promises Promises是处理异步操作的对象,使用了 Promi ...

  2. 关于web前端中遇到的html,css小知识点

    容器溢出: 语法:overflow: visible | hidden | scroll | auto | inherit; visible:默认值,溢出内容不会被裁剪,正常显示 hidden: 溢出 ...

  3. airTest 应用到项目并优化

    之前已经介绍了airTest的原理,该文主要指引大家能够将airTest框架应用到具体的测试项目当中去. 首先要考虑的是: 1. 你是用airTest 去做什么自动化 (android, ios, w ...

  4. 2019-04-28——Django学习

    1.Django: Python Web应用开发框架,Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后 ...

  5. 机器学习--Lasso回归和岭回归

    之前我们介绍了多元线性回归的原理, 又通过一个案例对多元线性回归模型进一步了解, 其中谈到自变量之间存在高度相关, 容易产生多重共线性问题, 对于多重共线性问题的解决方法有: 删除自变量, 改变数据形 ...

  6. WebForm应用log4net记录错误日志——使用线程列队写入

    我的项目结构如下图: 日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包 线程日志帮助类 FlashLogger.cs 代码 using System; usin ...

  7. Git实际操作

    1.基本操作 git init 初始化仓库 git status 查看仓库状态 git add XXX.XX 向暂存区中添加文件XXX.XX git commit 保存仓库的历史记录 git log ...

  8. unity导入TexturePacker处理

    1.从Asset Store里下载TexturePackerImporter ,然后导入到项目中. 2.导入unity的一张大图和一个.tpsheet文件(注意原始图片也要在相同目录) 3.代码导入 ...

  9. MySQL加入log_bin报错

    MySQL中二进制日志功能默认是关闭的,查看各种开启方式后,确定在配置文件中加入如下配置来开启该功能: [root@bogon /]# more /etc/my.cnf [mysqld] datadi ...

  10. 简单的StringBuffer实现

    package com.letv.test.base; import java.util.Arrays; public class StringBuffer { private char[] valu ...