VirtualList

A headless virtualized list for rendering large flat datasets. Supports keyboard navigation, infinite scroll, and live prepend with scroll anchoring.

Basic Usage

500 items

Render a virtualized list with the useVirtualList hook or VirtualList component:

import { useVirtualList } from 'virtualized-ui';

const { virtualItems, totalSize, containerRef, measureElement } =
  useVirtualList({
    data,
    getItemId: (item) => item.id,
    estimatedItemHeight: 80,
  });

Or use the component API:

import { VirtualList } from 'virtualized-ui';

<VirtualList
  data={items}
  getItemId={(item) => item.id}
  height={400}
  renderItem={({ item, index }) => (
    <div>{item.title}</div>
  )}
/>
OptionTypeDefault
dataTData[]required
getItemId(item, i) => stringrequired
estimatedItemHeightnumber100
overscannumber5
gapnumber0

Features

Return Values (Hook)

const {
  virtualizer,      // TanStack Virtual instance
  virtualItems,     // Currently visible virtual items
  totalSize,        // Total scrollable height (px)
  containerRef,     // Ref for scroll container
  handleScroll,     // Scroll handler (for infinite scroll)
  handleKeyDown,    // Keyboard handler
  setFocusedItem,   // (index) => void
  focusedIndex,     // Current focused index
  scrollToIndex,    // (index) => void
  scrollToTop,      // () => void
  measureElement,   // Ref callback for dynamic sizing
  data,             // The data array
} = useVirtualList(options);
Powered by grishaLR
© 2026 virtualized-ui. All rights reserved.