useVirtualizer with count, getScrollElement, and estimateSize.useWindowVirtualizer and account for scrollMargin.height or width; skip DOM measurement.data[index] from estimateSize.measureElement and data-index; use resizeItem when the final size comes from outside the DOM.prepare, rerun layout on width changes, and call measure() after font changes.anchorTo: 'end', stable IDs, followOnAppend, and an end threshold.rangeExtractor but retain defaultRangeExtractor(range).count and trigger fetching when the last virtual item reaches it.lanes for masonry-like distribution instead.paddingStart; if scroll-to-index must avoid it, also use scrollPaddingStart.overscan; if rendering becomes expensive, reduce it and optimize the row.flushSync scrolling warnings -> set useFlushSync: false; this also permits more batching.directDomUpdates or an onChange DOM update path after measuring the trade-off.| Situation | Example setting |
|---|---|
| Ordinary fixed/variable list | overscan: 5 |
| End-anchored chat | overscan: 6, scrollEndThreshold: 80 |
| Table | estimateSize: () => 34, overscan: 20 |
| Fixed rows | estimateSize: () => 35 |
| Fixed columns | estimateSize: () => 100 |
overflow: auto.getTotalSize() on the virtualized axis.key, index, start, and size.translateY or translateX are applied.