当前位置: 首页 > news >正文

【前端】【业务场景】【面试】在前端项目中,当涉及大量数据渲染时,如何提高渲染性能并避免页面卡顿?

大量数据渲染性能优化:四层进阶法

循序渐进:先限量 → 再懒渲 → 后分批 → 终极后台协作


1 虚拟滚动:一次只保留“看得见”的节点
  • 核心思路:固定容器高度,让滚动条滚动 假象 的总长度;可视窗口内仅挂载极少量行元素。
  • 工具首选
    框架轻量库亮点
    Reactreact-window < 5 KBreact-virtualized 体积更小
    Vue2/3vue-virtual-scroll-list支持动态行高
    原生clusterize.js零依赖,table 支持好
  • 要点
    • 动态行高时记得缓存行高,减少二次回流。
    • 滚动事件节流:requestAnimationFrame 包装 onScroll

2 懒加载 / 分页:把“总量”切碎
  • 前端分页:仅适合一次性拿到全部数据,再切页展示。
  • 后端分页(推荐):接口携带 page / pageSize,滚动触底或按钮翻页。
    const fetchPage = (page = 1) =>fetch(`/api/users?page=${page}&size=20`).then(r => r.json())
    
  • 无限滚动 UX:触底自动 loadMore,同时保留“回顶”按钮,防迷失。

3 分批渲染:给主线程透口气
function chunkRender(list, size = 100) {let i = 0const container = document.getElementById('root')function work(deadline) {while (i < list.length && deadline.timeRemaining() > 1) {const el = document.createElement('li')el.textContent = list[i++]container.appendChild(el)}i < list.length && requestIdleCallback(work)}requestIdleCallback(work)
}
  • 兼容性兜底:若 requestIdleCallback 不可用,用 setTimeout(fn, 0) + 任务队列。
  • React 18:使用 startTransition 将低优先级批量更新标为可打断。

4 后台协作:把重活丢给 Web Worker 或 WASM
  • 场景:数据预计算 / 巨量 JSON 解析 / CSV 转换。
  • 做法
    const worker = new Worker('./parser.worker.js')
    worker.postMessage(bigFile)
    worker.onmessage = ({data}) => setRows(data) // 主线程仅渲染
    
  • 再提升:OffscreenCanvas 绘图或使用 WASM+SIMD 做排序搜索。

组合策略速查表

数据规模场景示例建议组合
1 k–5 k 行设置页表、评论虚拟滚动
5 k–20 k 行聊天记录、日志虚拟滚动 + 懒加载接口
20 k+ 行数据分析面板虚拟滚动 + 后端分页 + Web Worker 预处理
复杂计算大 CSV → 图表Worker/WASM + 分批渲染

🚀 记忆口诀

“虚拟滚 → 懒到手 → 闲批渲 → 工人干”
按需叠加这四招,十万级数据依旧顺滑,拒绝卡顿白屏。

http://www.xdnf.cn/news/111529.html

相关文章:

  • uniapp 安卓离线本地打包,Android Studio生成apk包
  • 27、Session有什么重⼤BUG?微软提出了什么⽅法加以解决?
  • Linux 命令行与 vi/vim 编辑器完全指南
  • continue插件实现IDEA接入本地离线部署的deepseek等大模型
  • 想要从视频中提取背景音乐怎么搞?其实视频提取音频非常简单
  • 金融系统上云之路:云原生后端架构在金融行业的演化与实践
  • 以太网的mac帧格式
  • 基于Vulkan Specialization Constants的材质变体系统
  • 第三篇:Django创建表关系及生命周期流程图
  • Java后端开发面试题(含答案)
  • java kafka
  • 初始https附带c/c++源码使用curl库调用
  • Java 调用webservice接口输出xml自动转义
  • 关于 xpath 查找 XML 元素的一点总结
  • 2025新版懒人精灵零基础及各板块核心系统视频教程-全分辨率免ROOT自动化开发
  • Docker从0-1搭建个人云盘(支持Android iOS PC)
  • 关于Safari浏览器在ios<16.3版本不支持正则表达式零宽断言的解决办法
  • 汽车自动驾驶介绍
  • OpenHarmony 开源鸿蒙北向开发——hdc工具使用及常用命令(持续更新)
  • 数据库进阶之MySQL 程序
  • ARINC818协议一些说明综述
  • onlyoffice8.3.3发布了-豆豆容器市场同步更新ARM64版本
  • 【CAPL实战:以太网】对IPv4报文的Payload部分进行分片并创建分片包
  • 从Kafka读取数据
  • Cephalon端脑云:神经形态计算+边缘AI·重定义云端算力
  • Trae或者VsCode无法识别相对路径(不自动切换工作目录)
  • 高光谱相机在生物医学中的应用:病理分析、智慧中医与成分分析
  • React在什么情况下需要用useReducer
  • 前缀和-724.寻找数组的中心下标-力扣(LeetCode)
  • java—14 ZooKeeper