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
英文地址,請注明出處:http://en.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;并提供了…