rc-virtual-list

React virtual scrolling list that renders only visible rows, used across the Ant Design ecosystem.

Library
npm
v3.19.2
813 stars
MIT License

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
80 /100 Excellent
Development Activity 80
Maintenance 88
Community 64
Maturity 60
Momentum 28

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
78 /100 Good
Architecture 84
Code Quality 82
Innovation 75
Learning Curve 70

rc-virtual-list is a windowed list component for React that renders only the rows currently visible in the viewport, keeping scroll performance smooth even with tens of thousands of items. It measures item heights dynamically, falls back to real (non-virtual) scrolling when the data set is small, and ships a custom scrollbar with drag and touch support.

Maintained by the rc-component team behind Ant Design, it’s the underlying list engine for components like Select, Table, Tree, and Cascader across the Ant Design component family, but is published standalone so any React app can use it directly for large lists, feeds, or grids.

What You Get

  • A <List> component accepting data, height, itemHeight, and a render-prop children function per item
  • Automatic real-height measurement via ResizeObserver for variable-height rows, correcting the virtual offset as items are measured
  • A custom ScrollBar with drag-to-scroll and both vertical and horizontal scrolling support (scrollWidth prop)
  • Touch and mobile scroll handling (useMobileTouchMove) plus wheel-based frame scrolling (useFrameWheel) for smooth cross-device behavior
  • An escape hatch (virtual={false}) to disable windowing and render a plain scrollable list when data sets are small

Common Use Cases

  • Rendering dropdown/select option lists with thousands of entries without frame drops
  • Building custom data tables or trees that need to virtualize rows or nodes
  • Powering infinite-scroll feeds where only a slice of items should exist in the DOM at once
  • Replacing ad-hoc virtualization logic in a design system with a maintained, tested primitive
  • Adding horizontal virtual scrolling to wide tables via the scrollWidth prop

Under The Hood

Architecture - List.tsx (the ~685-line core) composes several focused hooks — useHeights for per-item height caching, useDiffItem to compute added/removed items across renders, useFrameWheel/useMobileTouchMove for input handling, and useScrollTo for imperative scroll APIs exposed via ListRef — around a Filler component that renders a spacer sized to the full virtual content height with the visible slice absolutely positioned inside it. ScrollBar.tsx implements a separate draggable thumb overlay rather than relying on native scrollbars, giving consistent styling and drag behavior across browsers. Tech Stack - TypeScript targeting React 18+/19 as peer dependencies, built with father (the rc-component build tool) into ES and CJS output, using @rc-component/resize-observer for height measurement and @rc-component/util’s useEvent/useLayoutEffect for stable callback refs; docs are built with dumi. Code Quality - A tests/ directory covers list rendering, scroll behavior (including a Firefox-specific scroll test), props, touch interaction, and utility functions via rc-test/@testing-library/react, with ESLint (flat config) and Prettier enforced through Husky pre-commit hooks — a notably more mature testing setup than many rc-component siblings. API Design - The single <List> component with data/itemHeight/itemKey/render-prop children mirrors plain array .map() ergonomics, keeping adoption low-friction, while advanced behavior (horizontal scroll, imperative scrollTo, custom scrollbar styling) is opt-in via additional typed props rather than required configuration.

Used by 6 apps in this directory

TypeScript
56%
Other

agenta

AI Development · Developer Tools · Devops

4,788

The open-source LLMOps platform unifying prompt engineering, evaluation, and observability for teams building reliable LLM applications.

View details
91
Repo Health
77
Technical
67
Dependency
Built with
TypeScript 56%
Python 39%
Updated 5 days ago
TypeScript
72%
AGPL 3.0

APITable

Databases · Low Code Platforms

15,623

API-first collaborative spreadsheet-database platform that auto-generates REST APIs and lets teams build internal tools, CRMs, and dashboards without code.

View details
71
Repo Health
77
Technical
60
Dependency
Built with
TypeScript 72%
Java 22%
Updated 3 weeks ago
TypeScript
99%
AGPL 3.0

Cherry Studio

AI Assistants

52,202

All-in-one AI desktop client with 300+ assistants and multi-model support

View details
89
Repo Health
84
Technical
70
Dependency
Built with
TypeScript 99%
Updated 4 days ago
TypeScript
100%
Apache 2.0

ILLA Builder

Design Tools · Developer Tools · Low Code Platforms

12,327

Open-source low-code platform for building internal tools with drag-and-drop UI, reactive data bindings, and real-time collaboration.

View details
56
Repo Health
71
Technical
63
Dependency
Built with
TypeScript 100%
Updated 4 months ago
TypeScript
44%
Other

Magic

AI Agents · Automation · Low Code Platforms

5,043

Magic is an enterprise-grade open-source AI agent platform combining a generalist AI agent, workflow engine, IM, and collaborative office system for running an AI-powered digital workforce.

View details
70
Repo Health
79
Technical
65
Dependency
Built with
TypeScript 44%
PHP 32%
Updated 1 months ago
TypeScript
88%
AGPL 3.0

OpenPanel

Analytics

7,057

Open-source Mixpanel alternative with session replay, MCP integration, and privacy-first product analytics you fully control.

View details
74
Repo Health
74
Technical
65
Dependency
Built with
TypeScript 88%
MDX 10%
Updated 1 weeks ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers