В библиотеке MUI (Material-UI) сортировка и фильтрация реализуются преимущественно через компоненты DataGrid, Table, а также через комбинацию состояний React и функций обработки массивов. Эти инструменты позволяют управлять отображением данных в таблицах и списках, обеспечивая гибкость и интерактивность интерфейсов.
Компонент DataGrid предоставляет
встроенную поддержку сортировки и фильтрации без необходимости писать
сложную логику вручную.
Сортировка включается через свойство sortable в
столбцах:
import * as React from 'react';
import { DataGrid } from '@mui/x-data-grid';
const columns = [
{ field: 'id', headerName: 'ID', width: 90 },
{ field: 'name', headerName: 'Имя', width: 150, sortable: true },
{ field: 'age', headerName: 'Возраст', type: 'number', width: 110, sortable: true },
];
const rows = [
{ id: 1, name: 'Алексей', age: 35 },
{ id: 2, name: 'Мария', age: 28 },
{ id: 3, name: 'Иван', age: 42 },
];
export default function SortingExample() {
return (
<div style={{ height: 400, width: '100%' }}>
<DataGrid rows={rows} columns={columns} />
</div>
);
}
sortable: true активирует сортировку
по конкретному столбцу.sortModel:<DataGrid
rows={rows}
columns={columns}
sortModel={[{ field: 'age', sort: 'asc' }]}
/>
Фильтрация в DataGrid поддерживается через
встроенные фильтры столбцов или через API filterModel:
<DataGrid
rows={rows}
columns={columns}
filterModel={{
items: [{ columnField: 'age', operatorValue: '>=', value: '30' }],
}}
/>
columnField — поле столбца для фильтрации.operatorValue — оператор сравнения (=,
!=, >, <,
>=, <=, contains,
startsWith и др.).value — значение фильтра.Можно комбинировать несколько фильтров, создавая массив объектов в
items.
Если требуется специфическая логика, DataGrid позволяет передавать
функции для сортировки и фильтрации через sortComparator и
кастомные фильтры.
const columns = [
{
field: 'name',
headerName: 'Имя',
width: 150,
sortable: true,
sortComparator: (v1, v2) => v1.localeCompare(v2, 'ru', { sensitivity: 'base' }),
},
];
sortComparator позволяет реализовать сортировку с
учетом локали, чувствительности к регистру и других особенностей.function customFilter(rows, filterValue) {
return rows.filter((row) => row.name.toLowerCase().includes(filterValue.toLowerCase()));
}
const [filterText, setFilterText] = React.useState('');
const filteredRows = customFilter(rows, filterText);
<DataGrid rows={filteredRows} columns={columns} />
Table)
и сортировкаВ компоненте Table сортировка и
фильтрация не встроены, но реализуются через обработку данных перед
рендером.
const [sortConfig, setSortConfig] = React.useState({ key: 'age', direction: 'asc' });
const sortedRows = [...rows].sort((a, b) => {
if (a[sortConfig.key] < b[sortConfig.key]) return sortConfig.direction === 'asc' ? -1 : 1;
if (a[sortConfig.key] > b[sortConfig.key]) return sortConfig.direction === 'asc' ? 1 : -1;
return 0;
});
sortConfig.direction для переключения между
asc и desc.const [filterText, setFilterText] = React.useState('');
const filteredRows = rows.filter((row) => row.name.toLowerCase().includes(filterText.toLowerCase()));
filteredRows используется при рендере
<TableBody>.Для управления сортировкой и фильтрацией удобно использовать компоненты MUI:
Пример комбинированного управления:
<TextField
label="Фильтр по имени"
variant="outlined"
size="small"
value={filterText}
onCha nge={(e) => setFilterText(e.target.value)}
/>
<IconButton onCl ick={toggleSortDirection}>
{sortConfig.direction === 'asc' ? <ArrowUpward /> : <ArrowDownward />}
</IconButton>
multiSort).Slider, Checkbox,
DatePicker).server-side sorting и
server-side filtering.useMemo для мемоизации вычисленных
списков.pagination или
virtualization (DataGrid поддерживает
autoHeight и rowBuffer).sortable и
filterable в DataGrid.sortComparator и
кастомные фильтры при необходимости.