npm / react-virtualized
react-virtualized
What changed in react-virtualized 10, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-25.
19 breaking11 new APIs and options2 performance1 tooling15 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initreact-virtualized 1048 changes
Breaking changes 19
With auto alignment, an item larger than the viewport is aligned to its start instead of its end.
List no longer sets aria-label="grid" or aria-readonly by default; pass role="grid" for the previous version 9 roles.
AutoSizer was removed from react-virtualized; use the react-virtualized-auto-sizer package 2.x, whose renderProp or ChildComponent replaces the children function.
Children must accept a ref or be registered with registerChild; unmeasurable cells retain the cache's default size rather than being cached as 0×0.
Derived column widths and row heights use measured cells only; default sizes apply only when a row or column has no measured cells.
Table treats non-Column child elements as columns with default column props instead of throwing.
Exported default*Props objects replace static defaultProps on components.
The package now ships one ES module and one CommonJS module with an exports map.
Grid and List/Table offset methods default to the last cell or row and auto alignment rather than using removed scroll target props.
InfiniteLoader re-renders its registered child using the first supported imperative method; custom function-component children must expose one.
ListProps no longer includes Grid props that do not apply to a single-column list, including estimatedColumnSize and overscanColumnCount.
React 18 or newer is required; the react and react-dom peer dependency range is ^18.0.0 || ^19.0.0.
Deep imports and the UMD build are no longer supported; import components from the package root.
Refs now expose imperative handles rather than component instances; type them with the exported *ImperativeAPI types.
ScrollSync and ArrowKeyStepper now drive children through a registerChild ref callback instead of controlled scroll props.
Grid, List, Masonry, and Table can use the window or a scrollable element as their scrolling container, replacing WindowScroller.
Controlled scroll props were removed. Use imperative ref methods for one-time scrolling; List and Table methods now take an object argument.
Manual position updates are no longer needed because the component remeasures its position on scroll, resize, and render.
WindowScroller and its associated types and props were removed; use scrollElement on supported components.
New APIs and options 11
List and Table getOffsetForRow accept align; alignment is deprecated.
Grid adds getTotalColumnsWidth.
Grid adds getTotalRowsHeight.
Sets an initial horizontal scroll offset, including during server rendering; it is read at mount.
Sets an initial vertical scroll offset, including during server rendering; it is read at mount and is ignored when scrollElement is supplied.
Masonry's imperative handle adds forceUpdate, recomputeGridSize, and invalidateCellSizeAfterRender.
Masonry supports row direction.
Top-right and bottom-left scrollbars can be hidden.
With a scrollElement, the component renders at full height, virtualizes the scroll element's viewport, and its scroll methods scroll that element; height is optional.
A ScrollElement type is exported for the scrollElement API.
Imperative handles add scrollToCell for List, Table, and MultiGrid; Grid's method accepts an align parameter.
Performance 2
Derived column widths and row heights are updated incrementally instead of checking every cell on each measurement, improving measurement of long lists.
Set sideEffects to false to improve builds.
Tooling 1
TypeScript types are provided for component props, imperative handles, and renderer parameters.
Fixes and other changes 15
Scroll offsets are scaled only once content exceeds about 16.7 million pixels in every browser, avoiding imprecise scrolling on Firefox and Safari for long lists.
CellMeasurer handles non-element and missing children without crashing, prioritizes registered elements, and ignores measure calls after unmount.
The helper no longer mutates defaultSortBy, and creates new sortBy and sortDirection values when criteria change so React state updates re-render Table.
Grid now works with React StrictMode and concurrent rendering; derived state is no longer mutated during render.
When row or column counts shrink, measurements for removed cells are discarded so totals and scrollable range no longer include them.
Table's headerHeight prop is optional because it defaults to 0.
InfiniteLoader recomputes Grid and List sizes starting at the newly loaded row rather than row 0.
Masonry no longer renders cells beyond cellCount after it shrinks, or recomputes positions for removed cells.
MultiGrid recomputeGridSize now updates its own layout, and changes to fixed scrolling, caches, sizes, renderers, and counts are handled correctly.
Components now detect scrollElement changes between null and an element, attaching or removing listeners as needed.
scrollToColumn is supported for server-side rendering.
Scrolling methods now scroll the window or scroll element for window-scrolled components instead of updating internal state that was overwritten.
scrollToRow is supported for server-side rendering.
Table keys header and row cells by each Column's key so cells move with columns when reordered.
Table no longer sets aria-sort="none" on a column header that is not sortable.