diff --git a/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx b/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx index aaf3d2bfe6dc2..7aa2bb377c5a0 100644 --- a/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx +++ b/packages/x-data-grid/src/hooks/features/virtualization/useGridVirtualScroller.tsx @@ -129,10 +129,17 @@ export const useGridVirtualScroller = () => { const previousSize = React.useRef<{ width: number; height: number }>(null); + const observerRef = React.useRef(null); const mainRefCallback = React.useCallback( (node: HTMLDivElement | null) => { mainRef.current = node; + // Cleanup for React 18 that calls the ref callback with null when unmounting + if (observerRef.current) { + observerRef.current.disconnect(); + observerRef.current = null; + } + if (!node) { return undefined; } @@ -175,12 +182,14 @@ export const useGridVirtualScroller = () => { lastSize = newSize; }); + observerRef.current = observer; observer.observe(node); if (reactMajor >= 19) { return () => { mainRef.current = null; observer.disconnect(); + observerRef.current = null; }; } return undefined;