Rendering thousands of list items kills performance. Virtual scrolling renders only visible items plus a buffer, dramatically reducing DOM nodes. The react-window library provides FixedSizeList and VariableSizeList components that handle viewport calculations. I wrap list items in the virtualizer's child component and provide item height. For variable heights, I estimate initial heights and measure actual heights on render. Virtual scrolling works well with React Query's infinite queries—fetch pages on demand as users scroll. The trade-off is losing browser find-in-page and accessibility features, so I only virtualize truly large lists. For most cases, pagination or infinite scroll is simpler.