Skip to content

Commit f77d2af

Browse files
authored
[DataGridPro] Fetch new rows only once when multiple models are changed in one cycle (@arminmeh) (#16382)
1 parent 91b4b7f commit f77d2af

File tree

4 files changed

+162
-140
lines changed

4 files changed

+162
-140
lines changed

packages/x-data-grid-generator/src/hooks/useMockServer.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type UseMockServerResponse = {
4242
getChildrenCount?: (row: GridRowModel) => number;
4343
fetchRows: (url: string) => Promise<GridGetRowsResponse>;
4444
loadNewData: () => void;
45+
isReady: boolean;
4546
};
4647

4748
type DataSet = 'Commodity' | 'Employee' | 'Movies';
@@ -360,5 +361,6 @@ export const useMockServer = (
360361
loadNewData: () => {
361362
setIndex((oldIndex) => oldIndex + 1);
362363
},
364+
isReady: Boolean(data?.rows?.length),
363365
};
364366
};

packages/x-data-grid-pro/src/hooks/features/dataSource/useGridDataSource.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
GridRowId,
1111
} from '@mui/x-data-grid';
1212
import { gridRowGroupsToFetchSelector, GridStateInitializer } from '@mui/x-data-grid/internals';
13+
import { unstable_debounce as debounce } from '@mui/utils';
1314
import { GridPrivateApiPro } from '../../../models/gridApiPro';
1415
import { DataGridProProcessedProps } from '../../../models/dataGridProProps';
1516
import { gridGetRowsParamsSelector, gridDataSourceErrorsSelector } from './gridDataSourceSelector';
@@ -252,6 +253,8 @@ export const useGridDataSource = (
252253
});
253254
}, [apiRef]);
254255

256+
const debouncedFetchRows = React.useMemo(() => debounce(fetchRows, 0), [fetchRows]);
257+
255258
const dataSourceApi: GridDataSourceApi = {
256259
unstable_dataSource: {
257260
setChildrenLoading,
@@ -269,12 +272,20 @@ export const useGridDataSource = (
269272
useGridApiMethod(apiRef, dataSourceApi, 'public');
270273
useGridApiMethod(apiRef, dataSourcePrivateApi, 'private');
271274

272-
useGridApiEventHandler(apiRef, 'sortModelChange', runIfServerMode(props.sortingMode, fetchRows));
273-
useGridApiEventHandler(apiRef, 'filterModelChange', runIfServerMode(props.filterMode, fetchRows));
275+
useGridApiEventHandler(
276+
apiRef,
277+
'sortModelChange',
278+
runIfServerMode(props.sortingMode, debouncedFetchRows),
279+
);
280+
useGridApiEventHandler(
281+
apiRef,
282+
'filterModelChange',
283+
runIfServerMode(props.filterMode, debouncedFetchRows),
284+
);
274285
useGridApiEventHandler(
275286
apiRef,
276287
'paginationModelChange',
277-
runIfServerMode(props.paginationMode, fetchRows),
288+
runIfServerMode(props.paginationMode, debouncedFetchRows),
278289
);
279290

280291
const isFirstRender = React.useRef(true);

0 commit comments

Comments
 (0)