跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

前端虚拟列表实现:避免万级 DOM 节点渲染

综述由AI生成介绍前端虚拟列表的实现方案,解决一次性渲染万级 DOM 导致页面卡顿的问题。通过只渲染视口内元素、计算偏移量及动态高度支持等原理,介绍了手动实现、使用 react-window 和 vue-virtual-scroller 三种方法。建议优先使用固定高度并设置缓冲区域以优化长列表性能。

神经兮兮发布于 2026/4/6更新于 2026/5/2029 浏览
前端虚拟列表实现:避免万级 DOM 节点渲染

前端虚拟列表实现:避免万级 DOM 节点渲染

为什么需要虚拟列表

一次性渲染大量列表项(如 5000+)会导致页面卡顿,严重影响用户体验。

反面案例
function BigList({ items }) {
  return (
    <ul style={{ height: '400px', overflow: 'auto' }}>
      {items.map(item => (
        <li key={item.id} style={{ height: '50px' }}>{item.name}</li>
      ))}
    </ul>
  );
}
// 使用示例
<BigList items={Array.from({ length: 10000 }, (_, i) => ({ id: i, name: `Item ${i}` }))} />
基础实现
import { useState, useRef, useMemo, useCallback } from 'react';

function VirtualList({ items, itemHeight, containerHeight }) {
  const [scrollTop, setScrollTop] = useState(0);
  const containerRef = ();

  
   visibleCount = .(containerHeight / itemHeight);
   totalHeight = items. * itemHeight;

  
   startIndex = .(scrollTop / itemHeight);
   endIndex = .(startIndex + visibleCount + , items.);

  
   visibleItems = ( {
     items.(startIndex, endIndex);
  }, [items, startIndex, endIndex]);

  
   offsetY = startIndex * itemHeight;

   handleScroll = ( {
    (e..);
  }, []);

   (
    
  );
}
useRef
null
// 计算可见区域
const
Math
ceil
const
length
// 计算起始和结束索引
const
Math
floor
const
Math
min
1
length
// 获取可见项
const
useMemo
() =>
return
slice
// 偏移量
const
const
useCallback
(e) =>
setScrollTop
target
scrollTop
return
<div ref={containerRef} style={{ height: containerHeight, overflow: 'auto' }} onScroll={handleScroll}> <div style={{ height: totalHeight, position: 'relative' }}> <div style={{ transform: `translateY(${offsetY}px)` }}> {visibleItems.map((item, index) => ( <div key={item.id} style={{ height: itemHeight }} className="virtual-list-item"> {item.name} </div> ))} </div> </div> </div>
使用 react-window
import { FixedSizeList as List } from 'react-window';

function VirtualList({ items }) {
  const Row = ({ index, style }) => (
    <div style={style} className="list-item">
      {items[index].name}
    </div>
  );

  return (
    <List height={400} itemCount={items.length} itemSize={50}>
      {Row}
    </List>
  );
}
使用 vue-virtual-scroller
<template>
  <RecycleScroller :items="items" :item-size="50" key-field="id" v-slot="{ item }">
    <div>{{ item.name }}</div>
  </RecycleScroller>
</template>

<script setup>
import { RecycleScroller } from 'vue-virtual-scroller';
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css';

const items = Array.from({ length: 10000 }, (_, i) => ({ id: i, name: `Item ${i}` }));
</script>

<style>
.scroller { height: 400px; }
.item { height: 50px; display: flex; align-items: center; padding: 0 20px; }
</style>

实战技巧:虚拟列表指南

1. 虚拟列表原理
  1. 只渲染可见项:仅渲染视口内的元素。
  2. 计算偏移量:通过 CSS transform 移动内容位置。
  3. 动态高度支持:预估高度或动态计算实际高度。
2. 最佳实践
  1. 固定高度:优先使用固定高度,性能更优。
  2. 缓冲区域:上下多渲染几个 item,避免滚动白屏。
  3. 滚动优化:结合 requestAnimationFrame 优化滚动事件。

目录

  1. 前端虚拟列表实现:避免万级 DOM 节点渲染
  2. 为什么需要虚拟列表
  3. 反面案例
  4. 基础实现
  5. 使用 react-window
  6. 使用 vue-virtual-scroller
  7. 实战技巧:虚拟列表指南
  8. 1. 虚拟列表原理
  9. 2. 最佳实践
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • PPT 嵌入 VR 全景图与空间照片实操指南
  • Python 入门指南:环境搭建、核心优势与应用场景
  • Harness Engineering:给 AI 套上缰绳的工程学
  • 8 款 AIGC 降重工具功能对比与使用建议
  • 微分动态规划 DDP 与迭代线性二次型调节器 iLQR 理论推导
  • 基于 YOLO 与 LLM 的 Web 视觉检测系统:Django+Vue3 实时识别方案
  • Qt Creator 配置 GitHub Copilot AI 编程插件
  • Windows 下使用 John the Ripper 与 Hashcat 破解压缩文件密码
  • Mac 系统安装 Python 详细教程
  • 2026 年 3 月全球大模型全景:国产登顶、百万上下文与智能体爆发
  • 【云原生】Neo4j 图数据库从搭建到项目使用深度详解
  • C++ 继承进阶:友元、静态成员与菱形继承解析
  • 2026 年 3 月第三周 AI 科技大事:NVIDIA GTC 主导推理时代与 Agent 爆发
  • PowerShell 中 Invoke-WebRequest 的正确使用:避免参数匹配错误
  • C++ 二叉搜索树详解:概念、实现与应用
  • Linux 基础 IO 详解
  • C++ 笔试刷题实战:打怪、字符串分类及城市群问题解析
  • Vue3 开发:JavaScript 与 TypeScript 选型对比
  • Neo4j 插件 APOC 安装及配置指南
  • 近五年体内微/纳米机器人赋能肿瘤精准治疗:聚焦 GBM

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online