react虚拟滚动

复制代码
function VirtualList({ data, itemHeight, bufferSize = 5 }) {
  const [scrollTop, setScrollTop] = useState(0);
  const containerRef = useRef(null);
  
  // 计算可视区域范围
  const viewportHeight = containerRef.current?.clientHeight || 0;
  const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - bufferSize);
  const endIndex = Math.min(data.length, startIndex + Math.ceil(viewportHeight / itemHeight) + bufferSize * 2);

  // 动态渲染的条目
  const visibleItems = data.slice(startIndex, endIndex);

  return (
    <div 
      ref={containerRef}
      onScroll={(e) => setScrollTop(e.target.scrollTop)}
      style={{ height: '100%', overflow: 'auto' }}
    >
      {/* 占位容器,模拟完整列表高度 */}
      <div style={{ height: `${data.length * itemHeight}px` }}>
        {/* 实际渲染的内容 */}
        <div style={{ transform: `translateY(${startIndex * itemHeight}px)` }}>
          {visibleItems.map((item, index) => (
            <div key={item.id} style={{ height: `${itemHeight}px` }}>
              {item.content}
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}
  1. 缓冲区(bufferSize)​​:在可视区域外额外渲染少量条目,避免快速滚动时出现空白。

    1. 定高(itemHeight)​​:提前确定条目高度(或使用动态高度预测),简化位置计算。
    1. CSS Transform ​:用 translateY替代 top属性,利用GPU加速提升性能。
相关推荐
落一落,掉一掉4 小时前
第十三周前端加密绕过
前端
前端初见4 小时前
快速上手TypeScript,TS速通
javascript·ubuntu·typescript
Onlyᝰ5 小时前
前端tree树
javascript·vue.js·elementui
高德开放平台5 小时前
实战案例|借助高德开放平台实现智慧位置服务:路线导航的开发与实践
前端·后端
hemoo5 小时前
如何让echart的lengend在指定位置换行
javascript·echarts
老前端的功夫5 小时前
# HTTP缓存:从懵懵懂懂到了如指掌
前端
安卓开发者5 小时前
Docker与Nginx:现代Web部署的完美二重奏
前端·nginx·docker
Dorian_Ov05 小时前
GeoPandas+DataFrame实现shapefile文件导入PostGIS数据库
前端·gis
哟哟耶耶5 小时前
Starting again company 03
前端·javascript·vue.js