前端虚拟列表实现:别再渲染10000个DOM节点了

前端虚拟列表实现:别再渲染10000个DOM节点了

前端虚拟列表实现:别再渲染10000个DOM节点了

毒舌时刻

这代码写得跟网红滤镜似的——仅供参考。

各位前端同行,咱们今天聊聊前端虚拟列表。别告诉我你还在一次性渲染10000个列表项,那感觉就像把10000本书全部摆在桌面上——既占地方又难找。

为什么你需要虚拟列表

最近看到一个项目,一个下拉列表有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}` }))} /> // 浏览器:我太难了 

毒舌点评:这代码,我看了都替浏览器着急。渲染10000个DOM节点,你是想让用户的电脑变成暖炉吗?

前端虚拟列表的正确姿势

1. 基础虚拟列表实现

// 正确姿势:基础虚拟列表 import { useState, useRef, useMemo, useCallback } from 'react'; function VirtualList({ items, itemHeight, containerHeight }) { const [scrollTop, setScrollTop] = useState(0); const containerRef = useRef(null); // 计算可见区域 const visibleCount = Math.ceil(containerHeight / itemHeight); const totalHeight = items.length * itemHeight; // 计算起始和结束索引 const startIndex = Math.floor(scrollTop / itemHeight); const endIndex = Math.min(startIndex + visibleCount + 1, items.length); // 获取可见项 const visibleItems = useMemo(() => { return items.slice(startIndex, endIndex); }, [items, startIndex, endIndex]); // 偏移量 const offsetY = startIndex * itemHeight; const handleScroll = useCallback((e) => { setScrollTop(e.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> ); } // 使用 function App() { const items = Array.from({ length: 10000 }, (_, i) => ({ id: i, name: `Item ${i}` })); return ( <VirtualList items={items} itemHeight={50} containerHeight={400} /> ); } 

2. 使用react-window

// 正确姿势:使用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> ); } // 使用 function App() { const items = Array.from({ length: 10000 }, (_, i) => ({ id: i, name: `Item ${i}` })); return <VirtualList items={items} />; } 

3. 使用vue-virtual-scroller

<!-- Vue3中使用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> 

毒舌点评:早这么写,你的列表早流畅了。别告诉我你还在渲染10000个DOM节点,那你还是趁早去用分页吧。

实战技巧:虚拟列表指南

1. 虚拟列表原理

  1. 只渲染可见项:只渲染视口内的元素
  2. 计算偏移量:通过transform移动内容
  3. 动态高度支持:预估高度或动态计算

2. 最佳实践

  1. 固定高度:优先使用固定高度,性能好
  2. 缓冲区域:上下多渲染几个item,避免白屏
  3. 滚动优化:使用requestAnimationFrame

最后想说的

虚拟列表不是炫技,是性能优化。别再渲染10000个DOM节点了——虚拟化一下,你的应用会飞起来。

虚拟列表就像图书馆的检索系统,不需要把所有书都摆在桌上,只需要展示你想看的那几本。别做图书搬运工,做图书管理员。

Read more

VsCode 远程 Copilot 调用 Claude Agent 提示 “无效请求”?参数配置错误的修正

解决 VsCode 远程 Copilot 调用 Claude Agent 提示“无效请求”问题 当在 VsCode 中通过远程 Copilot 调用 Claude Agent 时,若出现“无效请求”错误提示,通常与参数配置错误有关。以下方法可帮助排查和修正问题。 检查 API 密钥配置 确保 Claude Agent 的 API 密钥已正确配置在 VsCode 设置中。打开 VsCode 的设置文件(settings.json),验证以下参数是否完整: "claude.apiKey": "your_api_key_here"

AI Coding 工具全方位对比:从 Copilot 到 Cursor,2026 年开发者如何选择?

AI Coding 工具全方位对比:从 Copilot 到 Cursor,2026 年开发者如何选择?

文章目录 * 一、AI 编程工具演进:四个阶段,三种范式 * 1.1 发展历程 * 1.2 三大技术流派 * 二、八大主流 AI 编程工具全景扫描 * 2.1 工具概览 * 三、十大维度深度对比 * 维度 1:代码补全准确率 * 维度 2:上下文理解能力 * 维度 3:响应速度 * 维度 4:多语言支持 * 维度 5:工程化能力 * 维度 6:企业级合规与安全 * 维度 7:生态集成能力 * 维度 8:学习曲线与易用性 * 维度 9:性价比分析 * 维度 10:

为每个人提供 LLMs:在 Google Colab 中运行 LLaMA-13B 模型和 LangChain

原文:towardsdatascience.com/llms-for-everyone-running-the-llama-13b-model-and-langchain-in-google-colab-68d88021cf0b https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c1c2e1a8e6731e9a039722d2789772e2.png 由 Glib Albovsky 拍摄的照片,Unsplash 在故事的第一部分中,我们使用了一个免费的 Google Colab 实例来运行 Mistral-7B 模型,并使用 FAISS(Facebook AI Similarity Search)数据库提取信息。在这一部分,我们将更进一步,我将展示如何运行 LLaMA 2 13B 模型;我们还将测试一些额外的 LangChain 功能,如创建基于聊天的应用程序和使用代理。同样,就像第一部分一样,所有使用的组件都是基于开源项目,并且将完全免费使用。 让我们开始吧!

在Windows11利用llama.cpp调用Qwen3.5量化模型测试

1.下载llama.cpp二进制文件 访问 https://github.com/ggml-org/llama.cpp/releases 或者 https://bgithub.xyz/ggml-org/llama.cpp/releases 选择适合自己平台的。我没有独立显卡,所以选择CPU版本 https://bgithub.xyz/ggml-org/llama.cpp/releases/download/b8192/llama-b8192-bin-win-cpu-x64.zip 解压到\d\llama8\目录。 2.下载量化模型 按照 章北海mlpy 公众号:Ai学习的老章~ID:mindszhang666 写的知乎文章Qwen3.5 0.8B/2B/