2026/5/21 16:15:30
网站建设
项目流程
广州网站设计公司vi设计公司,各电商网站的特点,网络营销推广策划的步骤,免费做推广的网站一、为什么要用虚拟列表#xff1f;问题本质当列表数据很多时#xff08;如 1w#xff09;#xff1a;DOM 数量过多 → 重排 / 重绘严重滚动卡顿React diff 变慢表格#xff08;Antd Table#xff09;尤其明显#x1f449; 瓶颈不在 JS#xff0c;而在 DOM二、虚拟列表…一、为什么要用虚拟列表问题本质当列表数据很多时如 1wDOM 数量过多 →重排 / 重绘严重滚动卡顿React diff 变慢表格Antd Table尤其明显瓶颈不在 JS而在 DOM二、虚拟列表核心原理一句话版只渲染“可视区域 上下缓冲”的那一小段数据其它用空白高度“占位”关键点只有 4 个滚动容器高度固定每一项高度固定 or 可计算根据 scrollTop 计算 startIndex / endIndex用 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 buffer2️⃣ DOM 结构示意div classcontainer onScroll div styleheight: totalHeight div styletransform: translateY(offset) {visibleItems.map(render)} /div /div /div3️⃣ 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 Mapindex, height()首次渲染测量高度缓存起来用累计高度数组做滚动定位 react-window、react-virtual 都是这个思路方案二估算高度 滚动修正先用estimatedHeight渲染后真实测量修正scrollTop五、直接用成熟库强烈推荐1️⃣ react-window轻量首选npm i react-windowimport { FixedSizeList as List } from react-window List height{600} itemCount{10000} itemSize{40} width100% {({ index, style }) ( div style{style}{data[index].name}/div )} /List性能极好、API 简单2️⃣ react-virtualTanStack不定高可横向虚拟表格/瀑布流都行const rowVirtualizer useVirtualizer({ count: data.length, getScrollElement: () parentRef.current, estimateSize: () 40, })3️⃣ Ant Design 表格怎么办官方推荐组合Table react-windowVirtualTable社区实现Antd v5 已支持virtualTable columns{columns} dataSource{data} scroll{{ y: 600 }} virtual /⚠️列宽、固定列、合并单元格要测试六、你在性能平台里如何用结合你实际项目你之前提到的场景非常典型性能查询列表性能问题 / 覆盖度表格CPU 架构对比推荐策略场景建议普通列表react-windowAntd 表格Antd v5 virtual 或 react-virtual图表下方明细虚拟列表 memo操作列多行高度固定避免 auto七、常见坑非常重要❌ 1. 监听 window.scroll必须用容器滚动❌ 2. key 用 index 用业务唯一 id❌ 3. 频繁 setStaterequestAnimationFrame/ 节流❌ 4. 虚拟 动画 几乎一定卡八、性能组合拳虚拟列表 ≠ 万能虚拟列表必须配合React.memouseCallback列 render 函数拆分避免匿名函数避免同步计算九、总结一句话虚拟列表的本质不是“快”而是“DOM 数量永远可控”