当前位置: 首页 > news >正文

React实现虚拟列表的优秀库介绍

在 React 中,有一些优秀的库可以帮助你实现高效的虚拟列表渲染。以下是几个常用的库:

1. react-window

react-window 是一个轻量级的虚拟列表库,适用于大多数虚拟列表需求。它提供了简单易用的 API 和良好的性能。

安装

npm install react-window

示例代码

import React, { useCallback } from 'react';
import { FixedSizeList as List } from 'react-window';const generateUniqueKey = () => `${new Date().getTime()}-${Math.random().toString(36).substr(2, 9)}`;const DATA_LIST = Array.from({ length: 100000 }, (_, index) => ({key: generateUniqueKey(),slogan: `Item ${index + 1}`,bgColor: `hsl(${Math.random() * 360}, 100%, 75%)`
}));const ITEM_HEIGHT = 35;const Row = ({ index, style }) => (<div style={{ ...style, backgroundColor: DATA_LIST[index].bgColor }}>{DATA_LIST[index].slogan}</div>
);const VirtualListPage = () => (<Listheight={window.innerHeight}itemCount={DATA_LIST.length}itemSize={ITEM_HEIGHT}width={'100%'}>{Row}</List>
);export default VirtualListPage;

2. react-virtualized

react-virtualized 是一个功能强大的虚拟列表库,提供了更多的功能和配置选项,适用于复杂的虚拟列表需求。

安装

npm install react-virtualized

示例代码

import React from 'react';
import { List } from 'react-virtualized';const generateUniqueKey = () => `${new Date().getTime()}-${Math.random().toString(36).substr(2, 9)}`;const DATA_LIST = Array.from({ length: 100000 }, (_, index) => ({key: generateUniqueKey(),slogan: `Item ${index + 1}`,bgColor: `hsl(${Math.random() * 360}, 100%, 75%)`
}));const ITEM_HEIGHT = 35;const rowRenderer = ({ key, index, style }) => (<div key={key} style={{ ...style, backgroundColor: DATA_LIST[index].bgColor }}>{DATA_LIST[index].slogan}</div>
);const VirtualListPage = () => (<Listwidth={window.innerWidth}height={window.innerHeight}rowCount={DATA_LIST.length}rowHeight={ITEM_HEIGHT}rowRenderer={rowRenderer}/>
);export default VirtualListPage;

3. react-virtual

react-virtual 是一个现代的虚拟列表库,提供了简单的 API 和良好的性能。

安装

npm install @tanstack/react-virtual

示例代码

import React from 'react';
import { useVirtual } from '@tanstack/react-virtual';const generateUniqueKey = () => `${new Date().getTime()}-${Math.random().toString(36).substr(2, 9)}`;const DATA_LIST = Array.from({ length: 100000 }, (_, index) => ({key: generateUniqueKey(),slogan: `Item ${index + 1}`,bgColor: `hsl(${Math.random() * 360}, 100%, 75%)`
}));const ITEM_HEIGHT = 35;const VirtualListPage = () => {const parentRef = React.useRef();const rowVirtualizer = useVirtual({size: DATA_LIST.length,parentRef,estimateSize: React.useCallback(() => ITEM_HEIGHT, []),});return (<divref={parentRef}style={{height: '100vh',width: '100%',overflow: 'auto',}}><divstyle={{height: `${rowVirtualizer.totalSize}px`,width: '100%',position: 'relative',}}>{rowVirtualizer.virtualItems.map(virtualRow => (<divkey={virtualRow.index}ref={virtualRow.measureRef}style={{position: 'absolute',top: 0,left: 0,width: '100%',height: `${ITEM_HEIGHT}px`,transform: `translateY(${virtualRow.start}px)`,backgroundColor: DATA_LIST[virtualRow.index].bgColor,}}>{DATA_LIST[virtualRow.index].slogan}</div>))}</div></div>);
};export default VirtualListPage;

4. antd 库:优秀的 React 库,这里不多介绍,详情看官网。

总结

  • react-window:轻量级,适用于大多数虚拟列表需求。
  • react-virtualized:功能强大,适用于复杂的虚拟列表需求。
  • react-virtual:现代化,提供简单的 API 和良好的性能。
  • antd 库:优秀的 React 库,不多介绍。

根据你的具体需求选择合适的库,可以大大简化虚拟列表的实现,并提高性能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 隐马尔可夫模型(Hidden Markov Model,HMM)—有监督学习方法、概率模型、生成模型
  • 排序方法sort使用方式不同而产生的不同结果,附力扣179思路
  • [001-03-007].第07节:Redis中的事务
  • 【数据结构与算法 | 灵神题单 | 快慢指针(链表)篇】力扣876, 2095, 234
  • CSS之我不会
  • tailscale与zerotier在linux冲突问题解决
  • 基于SSM的养老院管理系统
  • MyBatis 方法重载的陷阱及解决方案
  • 【Python】解析网络源码节点的时候,遇到空白的行怎么办?
  • HTML5超酷炫的水果蔬菜在线商城网站源码系列模板1
  • 【Qt】选择器
  • 【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)
  • Docker打包镜像
  • JavaScript高级——显式原型和隐式原型
  • 自学半年LabVIEW,能搭建出来一个系统吗
  • Git同步原始仓库到Fork仓库中
  • JavaScript类型识别
  • leetcode讲解--894. All Possible Full Binary Trees
  • Less 日常用法
  • Logstash 参考指南(目录)
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PAT A1120
  • Python实现BT种子转化为磁力链接【实战】
  • Sass Day-01
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 后端_ThinkPHP5
  • 巧用 TypeScript (一)
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​香农与信息论三大定律
  • #define、const、typedef的差别
  • #QT(智能家居界面-界面切换)
  • #QT项目实战(天气预报)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (备份) esp32 GPIO
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)一些感悟
  • .NET8使用VS2022打包Docker镜像
  • .NET关于 跳过SSL中遇到的问题
  • @Autowired多个相同类型bean装配问题
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [AIGC] Spring Interceptor 拦截器详解
  • [AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现
  • [android] 看博客学习hashCode()和equals()
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [BT]小迪安全2023学习笔记(第29天:Web攻防-SQL注入)
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)