diff --git a/packages/x-data-grid-premium/src/DataGridPremium/useDataGridPremiumComponent.tsx b/packages/x-data-grid-premium/src/DataGridPremium/useDataGridPremiumComponent.tsx index b20a971759fc6..c6b97d749f209 100644 --- a/packages/x-data-grid-premium/src/DataGridPremium/useDataGridPremiumComponent.tsx +++ b/packages/x-data-grid-premium/src/DataGridPremium/useDataGridPremiumComponent.tsx @@ -130,8 +130,8 @@ export const useDataGridPremiumComponent = ( useGridInitializeState(columnPinningStateInitializer, apiRef, props); useGridInitializeState(columnsStateInitializer, apiRef, props); useGridInitializeState(rowPinningStateInitializer, apiRef, props); - useGridInitializeState(paginationStateInitializer, apiRef, props); useGridInitializeState(rowsStateInitializer, apiRef, props); + useGridInitializeState(paginationStateInitializer, apiRef, props); useGridInitializeState(editingStateInitializer, apiRef, props); useGridInitializeState(focusStateInitializer, apiRef, props); useGridInitializeState(sortingStateInitializer, apiRef, props); diff --git a/packages/x-data-grid-premium/src/hooks/features/clipboard/useGridClipboardImport.ts b/packages/x-data-grid-premium/src/hooks/features/clipboard/useGridClipboardImport.ts index 02d12c75a2d78..92c50cebc1366 100644 --- a/packages/x-data-grid-premium/src/hooks/features/clipboard/useGridClipboardImport.ts +++ b/packages/x-data-grid-premium/src/hooks/features/clipboard/useGridClipboardImport.ts @@ -341,7 +341,6 @@ export const useGridClipboardImport = ( const onProcessRowUpdateError = props.onProcessRowUpdateError; const getRowId = props.getRowId; const enableClipboardPaste = !props.disableClipboardPaste; - const rootEl = apiRef.current.rootElementRef?.current; const logger = useGridLogger(apiRef, 'useGridClipboardImport'); const splitClipboardPastedText = props.splitClipboardPastedText; @@ -366,6 +365,7 @@ export const useGridClipboardImport = ( } } + const rootEl = apiRef.current.rootElementRef?.current; if (!rootEl) { return; } @@ -418,7 +418,6 @@ export const useGridClipboardImport = ( onProcessRowUpdateError, getRowId, enableClipboardPaste, - rootEl, splitClipboardPastedText, pagination, paginationMode, diff --git a/packages/x-data-grid-pro/src/DataGridPro/useDataGridProComponent.tsx b/packages/x-data-grid-pro/src/DataGridPro/useDataGridProComponent.tsx index 9ed95d39ec31f..51040a83f2c5b 100644 --- a/packages/x-data-grid-pro/src/DataGridPro/useDataGridProComponent.tsx +++ b/packages/x-data-grid-pro/src/DataGridPro/useDataGridProComponent.tsx @@ -117,8 +117,8 @@ export const useDataGridProComponent = ( useGridInitializeState(columnPinningStateInitializer, apiRef, props); useGridInitializeState(columnsStateInitializer, apiRef, props); useGridInitializeState(rowPinningStateInitializer, apiRef, props); - useGridInitializeState(paginationStateInitializer, apiRef, props); useGridInitializeState(rowsStateInitializer, apiRef, props); + useGridInitializeState(paginationStateInitializer, apiRef, props); useGridInitializeState(editingStateInitializer, apiRef, props); useGridInitializeState(focusStateInitializer, apiRef, props); useGridInitializeState(sortingStateInitializer, apiRef, props); diff --git a/packages/x-data-grid-pro/src/hooks/features/infiniteLoader/useGridInfiniteLoader.tsx b/packages/x-data-grid-pro/src/hooks/features/infiniteLoader/useGridInfiniteLoader.tsx index ae1b6f11d06ea..1a531bcc95e9e 100644 --- a/packages/x-data-grid-pro/src/hooks/features/infiniteLoader/useGridInfiniteLoader.tsx +++ b/packages/x-data-grid-pro/src/hooks/features/infiniteLoader/useGridInfiniteLoader.tsx @@ -63,9 +63,8 @@ export const useGridInfiniteLoader = ( } }); - const virtualScroller = apiRef.current.virtualScrollerRef.current; - React.useEffect(() => { + const virtualScroller = apiRef.current.virtualScrollerRef.current; if (!isEnabled) { return; } @@ -85,7 +84,7 @@ export const useGridInfiniteLoader = ( if (triggerElement.current) { observer.current.observe(triggerElement.current); } - }, [apiRef, virtualScroller, handleLoadMoreRows, isEnabled, props.scrollEndThreshold]); + }, [apiRef, handleLoadMoreRows, isEnabled, props.scrollEndThreshold]); const updateTarget = (node: HTMLElement | null) => { if (triggerElement.current !== node) { diff --git a/packages/x-data-grid/src/DataGrid/useDataGridComponent.tsx b/packages/x-data-grid/src/DataGrid/useDataGridComponent.tsx index 57b087ab0ee9d..36bc1d286372d 100644 --- a/packages/x-data-grid/src/DataGrid/useDataGridComponent.tsx +++ b/packages/x-data-grid/src/DataGrid/useDataGridComponent.tsx @@ -83,8 +83,8 @@ export const useDataGridComponent = ( */ useGridInitializeState(rowSelectionStateInitializer, apiRef, props); useGridInitializeState(columnsStateInitializer, apiRef, props); - useGridInitializeState(paginationStateInitializer, apiRef, props); useGridInitializeState(rowsStateInitializer, apiRef, props); + useGridInitializeState(paginationStateInitializer, apiRef, props); useGridInitializeState(editingStateInitializer, apiRef, props); useGridInitializeState(focusStateInitializer, apiRef, props); useGridInitializeState(sortingStateInitializer, apiRef, props); diff --git a/packages/x-data-grid/src/hooks/features/clipboard/useGridClipboard.ts b/packages/x-data-grid/src/hooks/features/clipboard/useGridClipboard.ts index 15152ae14af85..62d30c763a4cf 100644 --- a/packages/x-data-grid/src/hooks/features/clipboard/useGridClipboard.ts +++ b/packages/x-data-grid/src/hooks/features/clipboard/useGridClipboard.ts @@ -119,7 +119,12 @@ export const useGridClipboard = ( [apiRef, ignoreValueFormatter, clipboardCopyCellDelimiter], ); - useGridNativeEventListener(apiRef, apiRef.current.rootElementRef!, 'keydown', handleCopy); + useGridNativeEventListener( + apiRef, + () => apiRef.current.rootElementRef.current, + 'keydown', + handleCopy, + ); useGridApiOptionHandler(apiRef, 'clipboardCopy', props.onClipboardCopy); }; diff --git a/packages/x-data-grid/src/hooks/utils/useGridNativeEventListener.ts b/packages/x-data-grid/src/hooks/utils/useGridNativeEventListener.ts index 0d5b26a4c7763..70e65c8ff7d61 100644 --- a/packages/x-data-grid/src/hooks/utils/useGridNativeEventListener.ts +++ b/packages/x-data-grid/src/hooks/utils/useGridNativeEventListener.ts @@ -1,8 +1,7 @@ -import * as React from 'react'; import { RefObject } from '@mui/x-internals/types'; -import { isFunction } from '../../utils/utils'; import { useGridLogger } from './useGridLogger'; import { GridPrivateApiCommon } from '../../models/api/gridApiCommon'; +import { useGridApiOptionHandler } from './useGridApiEventHandler'; export const useGridNativeEventListener = < PrivateApi extends GridPrivateApiCommon, @@ -15,32 +14,20 @@ export const useGridNativeEventListener = < options?: AddEventListenerOptions, ) => { const logger = useGridLogger(apiRef, 'useNativeEventListener'); - const [added, setAdded] = React.useState(false); - const handlerRef = React.useRef(handler); - const targetElement = isFunction(ref) ? ref() : (ref?.current ?? null); + useGridApiOptionHandler(apiRef, 'rootMount', () => { + const targetElement = typeof ref === 'function' ? ref() : ref.current; - const wrapHandler = React.useCallback((event: HTMLElementEventMap[K]) => { - return handlerRef.current && handlerRef.current(event); - }, []); - - React.useEffect(() => { - handlerRef.current = handler; - }, [handler]); - - React.useEffect(() => { - if (targetElement && eventName && !added) { - logger.debug(`Binding native ${eventName} event`); - targetElement.addEventListener(eventName, wrapHandler, options); - - setAdded(true); + if (!targetElement || !eventName || !handler) { + return undefined; + } - const unsubscribe = () => { - logger.debug(`Clearing native ${eventName} event`); - targetElement.removeEventListener(eventName, wrapHandler, options); - }; + logger.debug(`Binding native ${eventName} event`); + targetElement.addEventListener(eventName, handler, options); - apiRef.current.subscribeEvent('unmount', unsubscribe); - } - }, [targetElement, wrapHandler, eventName, added, logger, options, apiRef]); + return () => { + logger.debug(`Clearing native ${eventName} event`); + targetElement.removeEventListener(eventName, handler, options); + }; + }); };