Blog>
Snippets

Managing Variable Item Sizes in TanStack Virtual

Show how to handle lists with items of varying heights or widths using TanStack Virtual, focusing on configuring the size measurement and ensuring the virtualizer correctly calculates the positions and sizes of items.
import { useVirtual } from '@tanstack/react-virtual';
Import useVirtual hook from TanStack Virtual package.
const rowVirtualizer = useVirtual({
  size: items.length, // Total number of items
  parentRef, // Ref to the scrolling container
  estimateSize: useCallback(() => 50, []), // Provide a default estimate size
  measureRef: measureRef // Ref to measure items' sizes dynamically
});
Initialize the row virtualizer. Use 'useCallback' for the estimateSize function to avoid unnecessary recalculations. 'measureRef' is provided to dynamically measure each item's size after rendering.
const RowComponent = ({ index, measureRef }) => (
  <div ref={measureRef}>
    {items[index]}
  </div>
);
Define a row component that receives an index and a measureRef. The measureRef is used to automatically measure this component's height after it's rendered.
return (
  <div ref={parentRef}>
    {rowVirtualizer.virtualItems.map(virtualRow => (
      <RowComponent key={virtualRow.index} index={virtualRow.index} measureRef={virtualRow.measureRef} />
    ))}
  </div>
);
Render a scrolling container and map each virtual item to a RowComponent, passing down the index and measureRef necessary for dynamic size measurement.