react-window 大数据列表和表格数据渲染组件之虚拟滚动

简介

React Window 是一个高效的 React 组件库,专为渲染大数据列表和表格数据而设计。它通过”虚拟化”技术(也称为”窗口化”或”列表虚拟化”)解决了在 React 应用中渲染大量数据时的性能问题。与传统方法不同,React Window 只渲染用户当前可见的元素,而不是整个列表,从而显著提高了渲染性能和内存使用效率。

主要特性

  • 高性能渲染:只渲染可视区域内的元素,大幅提升性能
  • 灵活的布局:支持固定大小和可变大小的列表项
  • 多种列表类型:支持垂直列表、水平列表和网格布局
  • 轻量级:体积小,依赖少,易于集成
  • 滚动优化:平滑的滚动体验,支持自动滚动到指定位置
  • TypeScript 支持:完整的类型定义

安装方法

npm install react-window
# 或
yarn add react-window

使用示例

固定大小的列表

import { FixedSizeList } from "react-window";const Example = () => {const items = Array(1000).fill().map((_, index) => `Item ${index}`);const Row = ({ index, style }) => (<divstyle={style}className="px-4 py-2 border-b border-gray-200 hover:bg-gray-50 transition-colors cursor-pointer">{items[index]}</div>);return (<div className="flex justify-center items-center min-h-screen bg-gray-100"><div className="bg-white rounded-lg shadow-lg overflow-hidden"><FixedSizeListheight={400}width={300}itemCount={items.length}itemSize={40}className="scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-gray-100">{Row}</FixedSizeList></div></div>);
};export default Example;

可变大小的列表

import { VariableSizeList } from "react-window";const Example = () => {const items = Array(1000).fill().map((_, index) => `Item ${index}`);// 根据索引返回不同的高度const getItemSize = (index) => {return 35 + (index % 3) * 15; // 35, 50, 65 像素的交替高度};const Row = ({ index, style }) => (<divstyle={style}className={`px-4 py-2 ${index % 2 === 0 ? "bg-gray-50" : "bg-white"}hover:bg-blue-50 transition-colorsborder-b border-gray-200cursor-pointerflex items-centertext-gray-700hover:text-blue-600`}><span className="mr-3 text-sm font-medium">{index + 1}.</span>{items[index]}</div>);return (<div className="flex justify-center items-center min-h-screen bg-gray-100"><div className="border border-gray-200 rounded-md overflow-hidden"><VariableSizeListheight={400}width={300}itemCount={items.length}itemSize={getItemSize}className="scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-gray-100">{Row}</VariableSizeList></div></div>);
};export default Example;

网格布局

import { FixedSizeGrid } from "react-window";const Example = () => {const Cell = ({ columnIndex, rowIndex, style }) => (<divstyle={style}className="border border-gray-200 p-2 bg-white hover:bg-gray-50 transition-colors duration-200 flex items-center justify-center text-sm text-gray-600">Item {rowIndex},{columnIndex}</div>);return (<div className="flex justify-center items-center min-h-screen bg-gray-100"><FixedSizeGridcolumnCount={100}columnWidth={100}height={400}rowCount={100}rowHeight={35}width={300}className="bg-white rounded border border-gray-300">{Cell}</FixedSizeGrid></div>);
};export default Example;

高级用法

结合 react-virtualized-auto-sizer 自适应容器大小

import { FixedSizeList } from "react-window";
import AutoSizer from "react-virtualized-auto-sizer";const Example = () => {const items = Array(1000).fill().map((_, index) => `Item ${index}`);const Row = ({ index, style }) => (<divstyle={style}className="px-4 py-2 border-b border-gray-200 hover:bg-gray-50 transition-colors duration-200"><span className="text-gray-800 font-medium">{items[index]}</span></div>);return (<div className="h-screen w-full bg-white shadow-lg rounded-lg overflow-hidden mt-7"><AutoSizer>{({ height, width }) => (<FixedSizeListclassName="scrollbar-thin scrollbar-thumb-gray-400 scrollbar-track-gray-100"height={height - 64} // Subtract header heightwidth={width}itemCount={items.length}itemSize={45}>{Row}</FixedSizeList>)}</AutoSizer></div>);
};export default Example;

使用 useRef 和 scrollToItem 方法

import { useRef } from "react";
import { FixedSizeList } from "react-window";const Example = () => {const listRef = useRef();const items = Array(1000).fill().map((_, index) => `Item ${index}`);const scrollToItem = (index) => {listRef.current.scrollToItem(index, "center");};return (<div className="p-6 max-w-md mx-auto bg-white rounded-xl"><div className="space-x-4 mb-6"><buttononClick={() => scrollToItem(50)}className="bg-blue-500 hover:bg-blue-600 text-white font-semibold py-2 px-4 rounded-lg transition duration-200">滚动到第50项</button><buttononClick={() => scrollToItem(300)}className="bg-green-500 hover:bg-green-600 text-white font-semibold py-2 px-4 rounded-lg transition duration-200">滚动到第300项</button></div><div className="border rounded-lg overflow-hidden"><FixedSizeListref={listRef}height={620}width={400}itemCount={items.length}itemSize={35}className="scrollbar-thin scrollbar-thumb-gray-400 scrollbar-track-gray-100">{({ index, style }) => (<divstyle={style}className="px-4 py-2 hover:bg-gray-100 transition-colors duration-150 border-b border-gray-100">{items[index]}</div>)}</FixedSizeList></div></div>);
};export default Example;

性能优化建议

  1. 使用 memoization:对列表项组件使用 React.memo 减少不必要的重渲染
  2. 避免内联样式:尽量使用 CSS 类而不是内联样式
  3. 合理设置 overscanCount:适当增加预渲染的项目数量,提升滚动体验
  4. 使用 isScrolling 参数:在快速滚动时可以显示占位符内容

与其他库的比较

  • react-virtualized:React Window 是 react-virtualized 的轻量级替代品,API 更简洁,体积更小
  • react-virtual:更现代的虚拟化库,使用 hooks API,但 React Window 更成熟稳定
  • 原生实现:相比自己实现虚拟滚动,React Window 提供了更完善的功能和更好的性能

 react-window大型列表和表格数据渲染组件之虚拟滚动 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89977.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eltable tree形式,序号列实现左对齐,并且每下一层都跟上一层的错位距离拉大

要的是如图所示效果序号加个class-name写样式然后给eltable加indent属性就可以了&#xff0c;我设置的25

FOC算法中SIMULINK一些常用模块(2)-Permanent Magnet Synchronous Machine模块

一&#xff0c;介绍这三个模块一起介绍了&#xff0c;由左到右&#xff0c;分别是电源模块&#xff0c;驱动模块和电机模块。主要介绍一下电机模块二&#xff0c;DC Voltage SourceDC Voltage Source 模块是用于表示直流电压源的基本组件&#xff0c;可以提供恒流直压&#xff…

RPG62.制作敌人攻击波数二:攻击ui

1。经典创建userwidget&#xff0c;使用xmbtextblock&#xff0c;结构如下。然后设置动画与音频&#xff0c;上下的参数是一样的&#xff0c;转到图表打开BP_SurvialGameMode2.再创建一个widget&#xff0c;结构如下新添的动画打开XMBGameModeBase&#xff0c;创建构造函数AXMB…

DL00691-基于深度学习的轴承表面缺陷目标检测含源码python

DL00691-基于深度学习的轴承表面缺陷目标检测含源码python

Word 中为什么我的图片一拖就乱跑,怎么精确定位?

核心原因&#xff1a;文字环绕方式 (Text Wrapping) 问题的根源在于图片的**“文字环绕”**设置。 默认状态&#xff1a;“嵌入型” (In Line with Text) 当您插入一张图片时&#xff0c;Word默认会把它当作一个巨大的文字字符来处理。这就是为什么您拖动它时&#xff0c;它会像…

Linux物理地址空间入门:从硬件到内核内存的基石

目录 一、物理地址空间是什么&#xff1f; 二、物理地址空间的构成&#xff1a;不仅仅是内存 三、Linux内核如何管理物理地址空间 &#xff08;1&#xff09;物理内存的碎片化问题 &#xff08;2&#xff09;物理地址的分区管理 &#xff08;3&#xff09;物理地址与内核…

【2025最新版】PDFelement全能PDF编辑器

工具https://pan.quark.cn/s/a56d17fd05dd强大全能的PDF编辑神器PDFelementPro 全能PDF工具套装 PDF阅读器 PDF创建器 PDF编辑器 PDF注释器 PDF转换器 OCR识别工具 表单填写和创建 数据提取 批量处理 更多详情万兴PDF专业版特性。格式转换&#xff1a;PDFelement轻松…

基于单片机汽车驾驶防瞌睡防疲劳报警器自动熄火设计

&#xff08;一&#xff09;系统功能设计 51单片机汽车驾驶防疲劳防瞌睡报警器自动熄火15 本系统由STC89C52单片机、蜂鸣器、ADXL345重力加速度传感器、继电器控制、按键、指示灯及电源组成。 1、通过按键点亮led灯&#xff0c;代表车辆启动和熄火。 2、车辆启动后&#xff0c;…

OpenCV中的卷积高斯模糊与中值模糊

目录 一、卷积高斯模糊 (Gaussian Blur) 1. 原理与数学基础 2. OpenCV函数实现 3. 关键参数说明 4. 代码示例 5. 特点与应用 二、中值模糊 (Median Blur) 1. 原理与数学基础 2. OpenCV函数实现 3. 关键参数说明 4. 代码示例 5. 特点与应用 三、两种模糊方法对比分析…

macbookpro m1 max本儿上速搭一个elasticsearch+kibana环境

一、找个目录&#xff0c;新建一个: docker-compose.yml version: "3.9" services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0 # 与 Kibana 版本一致container_name: elasticsearchenvironment:- discovery.typesingle-node- xpa…

部署zabbix企业级分布式监控

一. 监控系统的功能概述监控、从中文的字义来看&#xff0c;有两个内容&#xff0c;一是检测&#xff0c;二是控制。重点在第一个字眼&#xff0c;即检测、预防的意思。监控&#xff0c;对应的英文单词是 Monitoring。在计算机领域&#xff0c;可以将其分为5种监控类型。应用性…

【重学MySQL】redolog binlog

目录 Buffer Pool是什么&#xff1f; redo log&#xff08;Innodb独有&#xff09; 为什么需要redolog&#xff1f; 类比的方式巧记redolog binlog&#xff08;Server层独有&#xff09; binlog是干啥的&#xff1f; 为什么有了 binlog&#xff0c; 还要有 redo log&…

企业信息化建设技术底座建设解决方案

1、企业数字化底座与数字化综述2、企业数字化底座与数字化总体架构3、企业数字化底座与数字化规划设计4、企业数字化底座与数字化建设运营5、企业数字化底座与数字化未来展望篇幅有限以下只展示部分截图&#xff1a;

Spring Cloud Alibaba 之 Nacos

Spring Cloud Alibaba 之 Nacos . Nacos官方文档&#xff1a; https://nacos.io/docs/latest/overview/?spm5238cd80.47ee59c.0.0.770fcd36HoVbU6 1.什么是Nacos Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一款动态服务发现、…

Car Kit重构车机开发体验,让车载应用开发驶入快车道

在智能座舱成为汽车行业“新四化”核心战场的今天&#xff0c;开发者们正面临这样的挑战&#xff1a;如何让手机应用快速适配车机场景&#xff1f;如何实现手机与车机无感流转&#xff1f;如何在保障驾驶安全的前提下提供沉浸式交互体验&#xff1f; HarmonyOS SDK 车服务&…

ruoyi-flowable-plus Excel 导入数据 Demo

&#x1f4c1; 项目结构简述 ruoyi-flowable-plus 是基于 RuoYi 的扩展项目&#xff0c;使用&#xff1a; 后端&#xff1a;Spring Boot MyBatis Flowable前端&#xff1a;Vue.js &#x1f4e5; Excel 导入功能 Demo 以导入用户数据为例&#xff0c;展示完整导入流程。 …

kafka 日志索引 AbstractIndex

AbstractIndexAbstractIndex 是 Kafka 日志&#xff08;Log&#xff09;子系统中一个至关重要的基础类。它为 Kafka 的各种索引文件&#xff08;如偏移量索引 .index 和时间戳索引 .timeindex&#xff09;提供了一个统一的、抽象的框架。这个类的设计目标是实现极高的读写性能和…

重学前端008 --- 响应式网页设计 CSS 无障碍 Quiz

文章目录meta 总结html 页面结构img 尺寸子选择器 >a 锚点仅屏幕阅读器可见li 元素的悬停设置小屏幕防止溢出meta 总结 <head><!-- 基础字符编码声明 --><meta charset"UTF-8"><!-- 视口设置&#xff0c;响应式设计必备 --><meta nam…

C# 调用CodeSoft模板打印标签,编辑模板覆盖根目录的文件,不能拷贝

C# 调用CodeSoft模板打印标签&#xff0c;编辑模板覆盖根目录的文件&#xff0c;不能拷贝&#xff0c;报文件已经打开。 原因&#xff1a;C#窗体关闭时&#xff0c;没有关闭LabelManager2.ApplicationClass labApp&#xff0c;别忘记写labApp1.Quit(); if (labApp1 ! null) {la…

Logback简单使用

Logback 日志框架介绍 正如你所知&#xff0c;开发者拥有大量日志工具可供选择。本节中&#xff0c;我们将学习一个非常流行的日志库 —— Logback。它是 Log4j 日志库的继任者&#xff0c;基于相似的理念构建。Logback 在同步和异步日志记录方面都非常快速&#xff0c;并提供了…