При работе с таблицами, содержащими большое количество строк и колонок, обычная отрисовка всех элементов сразу приводит к серьёзным проблемам с производительностью. MUI (Material-UI) предоставляет средства для эффективной работы с большими объемами данных с помощью виртуализации, позволяющей рендерить только видимую часть таблицы и динамически подгружать элементы при прокрутке.
Виртуализация подразумевает, что DOM создаётся только для видимых элементов, а остальные строки и колонки хранятся в состоянии и отображаются по мере необходимости. Это значительно снижает нагрузку на браузер и ускоряет рендеринг.
Ключевые концепции:
В MUI это реализуется через компонент DataGrid с
включённой опцией виртуализации или с использованием интеграции с
библиотекой react-virtualized.
Компонент DataGrid поддерживает виртуализацию строк по
умолчанию. Основные свойства:
import * as React from 'react';
import { DataGrid } from '@mui/x-data-grid';
const columns = [
{ field: 'id', headerName: 'ID', width: 90 },
{ field: 'firstName', headerName: 'First name', width: 150 },
{ field: 'lastName', headerName: 'Last name', width: 150 },
];
const rows = Array.from({ length: 100000 }, (_, index) => ({
id: index,
firstName: `Имя ${index}`,
lastName: `Фамилия ${index}`,
}));
export default function VirtualizedGrid() {
return (
<div style={{ height: 600, width: '100%' }}>
<DataGrid
rows={rows}
columns={columns}
pageSize={100}
rowsPerPageOptions={[100]}
/>
</div>
);
}
Ключевые моменты:
pageSize определяет количество строк, рендерящихся
одновременно.rowsPerPageOptions позволяет переключать размер окна
виртуализации.style={{ height: 600 }}), иначе виртуализация работать не
будет.Для таблиц с большим количеством колонок MUI поддерживает виртуализацию колонок. Это особенно важно, когда таблица содержит сотни колонок.
Пример:
<DataGrid
rows={rows}
columns={columns}
columnBuffer={5} // число колонок, рендерящихся вне видимой области
autoHeight={false}
/>
columnBuffer отвечает за дополнительное количество колонок вокруг видимой области, что уменьшает эффект мерцания при прокрутке.
Если требуется более тонкая настройка или кастомизация виртуализации,
MUI позволяет интегрироваться с react-virtualized. Основной
подход заключается в использовании компонента Grid для
рендеринга ячеек:
import { Grid } from 'react-virtualized';
import { Paper } from '@mui/material';
const cellRenderer = ({ columnIndex, key, rowIndex, style }) => (
<Paper key={key} style={style}>
{rows[rowIndex][columns[columnIndex].field]}
</Paper>
);
<Grid
cellRenderer={cellRenderer}
columnCount={columns.length}
columnWidth={150}
height={600}
rowCount={rows.length}
rowHeight={40}
width={1200}
/>
Такой подход обеспечивает максимальную
производительность для огромных таблиц, когда
DataGrid может быть ограничен стандартными параметрами
виртуализации.
React.memo или useMemo для предотвращения
лишнего пересчета данных.getRowId: для уникальной
идентификации каждой строки без пересоздания ключей при рендеринге.getRowHeight позволяет экономить ресурсы при строках разной
высоты.infinite scroll).onScroll для синхронизации с внешними компонентами.scrollToIndexes у DataGrid или
Grid в react-virtualized позволяет мгновенно
перемещаться к нужной позиции.columnBuffer.В результате виртуализация больших таблиц в MUI позволяет работать с десятками тысяч строк и сотнями колонок без значительных задержек в интерфейсе, сохраняя плавную прокрутку и отзывчивость приложения.