系我一身心,负你千行泪。
大数据量展示
- 前端直接渲染展示过万数据,会造成页面卡顿。
后端服务器返回10W数据
- 安装 nodemon
1 | npm i nodemon -g |
- 新建一个server.js文件,简单起个服务,并返回给前端10w条数据,并通过nodemon server.js开启服务
1 | // server.js |
前端页面请求直接渲染
1 |
|
- 渲染时间
setTimeout分页渲染
- 把10w按照每页数量limit分成总共Math.ceil(total / limit)页,然后利用setTimeout,每次渲染1页数据,这样的话,渲染出首页数据的时间大大缩减。
1 | const renderList = async () => { |
requestAnimationFrame
- 用requestAnimationFrame代替setTimeout,减少了重排的次数,极大提高了性能
1 | const renderList = async () => { |
文档碎片
- 之前都是每次创建一个div标签就appendChild一次,但是有了文档碎片可以先把1页的div标签先放进文档碎片中,然后一次性appendChild到container中,这样减少了appendChild的次数,极大提高了性能。
- 页面只会渲染文档碎片包裹着的元素,而不会渲染文档碎片
1 | const renderList = async () => { |
懒加载(虚拟列表)
- 根据容器可视区域的列表容积数量,监听用户滑动或滚动事件,动态截取长列表数据中的部分数据渲染到页面上
- 基本实现
- 计算可视区域的高度
- 计算列表项的高度
- 计算可视区域能展示的列表项个数 =(可视区域高度 / 列表项高度) + 2
- 开始索引
- 结束索引
- 预加载(防止滚动过快,造成暂时白屏)
- 根据开始索引和结束索引,截取数据展示在可视区域
- 滚动节流
- 上下空白区使用padding实现
- 滑动到底,再次请求数据并拼接