news 2026/5/1 10:29:53

前端如何虚拟列表优化?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端如何虚拟列表优化?

一、为什么要用虚拟列表?

问题本质

当列表数据很多时(如 1w+):

  • DOM 数量过多 →重排 / 重绘严重

  • 滚动卡顿

  • React diff 变慢

  • 表格(Antd Table)尤其明显

👉瓶颈不在 JS,而在 DOM


二、虚拟列表核心原理(一句话版)

只渲染“可视区域 + 上下缓冲”的那一小段数据,其它用空白高度“占位”

关键点只有 4 个:

  1. 滚动容器高度固定

  2. 每一项高度固定 or 可计算

  3. 根据 scrollTop 计算 startIndex / endIndex

  4. 用 translateY 或 padding-top 做偏移


三、基础实现原理(固定高度版)

1️⃣ 核心计算公式

const itemHeight = 40 const containerHeight = 400 const visibleCount = Math.ceil(containerHeight / itemHeight) const startIndex = Math.floor(scrollTop / itemHeight) const endIndex = startIndex + visibleCount + buffer

2️⃣ DOM 结构示意

<div class="container" onScroll> <div style="height: totalHeight"> <div style="transform: translateY(offset)"> {visibleItems.map(render)} </div> </div> </div>

3️⃣ React 简化示例

const VirtualList = ({ data }) => { const containerRef = useRef(null) const [scrollTop, setScrollTop] = useState(0) const itemHeight = 40 const containerHeight = 400 const buffer = 5 const startIndex = Math.floor(scrollTop / itemHeight) const visibleCount = Math.ceil(containerHeight / itemHeight) const endIndex = startIndex + visibleCount + buffer const visibleData = data.slice(startIndex, endIndex) return ( <div ref={containerRef} style={{ height: containerHeight, overflow: 'auto' }} onScroll={(e) => setScrollTop(e.currentTarget.scrollTop)} > <div style={{ height: data.length * itemHeight }}> <div style={{ transform: `translateY(${startIndex * itemHeight}px)` }}> {visibleData.map(item => ( <div key={item.id} style={{ height: itemHeight }}> {item.name} </div> ))} </div> </div> </div> ) }

DOM 永远只有几十个


四、进阶:不定高虚拟列表(真实项目常见)

难点

  • 表格内容不确定

  • 操作列 / 多行文本 / 自动换行

解决思路

方案一(推荐):高度缓存 + 二分查找
const heightMap = new Map<index, height>()
  • 首次渲染测量高度

  • 缓存起来

  • 用累计高度数组做滚动定位

👉 react-window、react-virtual 都是这个思路


方案二:估算高度 + 滚动修正
  1. 先用estimatedHeight

  2. 渲染后真实测量

  3. 修正scrollTop


五、直接用成熟库(强烈推荐)

1️⃣ react-window(轻量,首选)

npm i react-window
import { FixedSizeList as List } from 'react-window' <List height={600} itemCount={10000} itemSize={40} width="100%" > {({ index, style }) => ( <div style={style}>{data[index].name}</div> )} </List>

👉性能极好、API 简单


2️⃣ react-virtual(TanStack)

  • 不定高

  • 可横向虚拟

  • 表格/瀑布流都行

const rowVirtualizer = useVirtualizer({ count: data.length, getScrollElement: () => parentRef.current, estimateSize: () => 40, })

3️⃣ Ant Design 表格怎么办?

官方推荐组合
  • Table + react-window

  • VirtualTable(社区实现)

Antd v5 已支持virtual

<Table columns={columns} dataSource={data} scroll={{ y: 600 }} virtual />

⚠️列宽、固定列、合并单元格要测试


六、你在性能平台里如何用(结合你实际项目)

你之前提到的场景非常典型:

  • 性能查询列表

  • 性能问题 / 覆盖度表格

  • CPU 架构对比

推荐策略

场景建议
普通列表react-window
Antd 表格Antd v5 virtual 或 react-virtual
图表下方明细虚拟列表 + memo
操作列多行高度固定,避免 auto

七、常见坑(非常重要)

❌ 1. 监听 window.scroll

👉必须用容器滚动

❌ 2. key 用 index

👉 用业务唯一 id

❌ 3. 频繁 setState

👉requestAnimationFrame/ 节流

❌ 4. 虚拟 + 动画

👉 几乎一定卡


八、性能组合拳(虚拟列表 ≠ 万能)

虚拟列表必须配合

  • React.memo

  • useCallback

  • 列 render 函数拆分

  • 避免匿名函数

  • 避免同步计算


九、总结一句话

虚拟列表的本质不是“快”,而是“DOM 数量永远可控”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:53:27

直播字幕实时生成:Fun-ASR流式识别落地案例

直播字幕实时生成&#xff1a;Fun-ASR流式识别落地案例 在一场电商直播中&#xff0c;主播语速飞快地介绍着“今晚八点限时秒杀&#xff0c;满300减50&#xff0c;前100名下单还送抽奖码”——观众一边抢券一边盯着屏幕&#xff0c;却因为没有字幕而漏掉了关键信息。这种场景每…

作者头像 李华
网站建设 2026/5/1 8:01:30

RFSoC实战指南:从芯片级SDR到系统级设计

挑战场景&#xff1a;当传统SDR遇上性能瓶颈 【免费下载链接】RFSoC-Book Companion Jupyter Notebooks for the RFSoC-Book. 项目地址: https://gitcode.com/gh_mirrors/rf/RFSoC-Book 技术痛点&#xff1a;传统的软件定义无线电系统往往面临硬件资源分散、处理延迟高、…

作者头像 李华
网站建设 2026/5/1 8:00:44

蜂鸣器工作原理解析:压电与电磁式全面讲解

蜂鸣器怎么选&#xff1f;压电式和电磁式的“声音哲学”大不同 你有没有注意过&#xff0c;微波炉加热完成时的“叮——”&#xff0c;和门禁刷卡成功时那声清脆的“嘀”有什么区别&#xff1f; 虽然都是蜂鸣器发出的声音&#xff0c;但它们背后的原理完全不同。一个像警笛般穿…

作者头像 李华
网站建设 2026/5/1 10:19:57

FanControl.HWInfo终极配置指南:零基础实现智能散热控制

你是否曾经为电脑过热而烦恼&#xff1f;是否希望风扇能够根据温度自动调节转速&#xff1f;FanControl.HWInfo插件正是你需要的解决方案&#xff01;这款专为FanControl软件设计的传感器插件&#xff0c;通过集成HWInfo硬件监控工具的Gadget报告功能&#xff0c;让普通用户也能…

作者头像 李华
网站建设 2026/5/1 9:13:50

开源精神驱动发展,欢迎更多开发者加入共建生态

开源精神驱动发展&#xff0c;欢迎更多开发者加入共建生态 在智能语音技术日益渗透日常办公与生活的今天&#xff0c;一个现实问题始终困扰着企业和个人用户&#xff1a;如何在保障数据隐私的前提下&#xff0c;高效完成语音转写任务&#xff1f;尤其是在会议纪要、教学记录、法…

作者头像 李华
网站建设 2026/5/1 6:51:15

HunyuanVideo-Foley:AI视频音效生成全新体验

HunyuanVideo-Foley&#xff1a;AI视频音效生成全新体验 【免费下载链接】HunyuanVideo-Foley 项目地址: https://ai.gitcode.com/tencent_hunyuan/HunyuanVideo-Foley 腾讯混元实验室近日开源了一款专为视频内容创作者打造的专业级AI音效生成模型——HunyuanVideo-Fol…

作者头像 李华