MUI (Material-UI) предоставляет компонент
TablePagination, который упрощает управление большим
количеством данных в таблицах за счёт разбивки на страницы. Он тесно
интегрируется с компонентом Table и позволяет
контролировать количество строк на странице, текущую страницу, а также
предоставлять пользователю возможность выбора размера страницы.
1. component Определяет, какой
HTML-элемент будет использоваться для рендеринга корневого компонента.
По умолчанию это TablePaginationActions.
2. count Общее количество строк данных
в таблице. Этот параметр обязателен для корректной работы пагинации.
Например, если таблица содержит 120 записей, count должен
быть равен 120.
3. page Текущая страница, нумерация
начинается с 0. Изменение этого значения обновляет отображаемый диапазон
строк.
4. rowsPerPage Количество строк на
одной странице. Обычно предоставляется список опций через
rowsPerPageOptions. Пример: [5, 10, 25].
5. onPageChange Функция-обработчик
изменения страницы. Принимает два аргумента: событие и номер новой
страницы. Внутри этой функции необходимо обновлять состояние текущей
страницы.
6. onRowsPerPageChange
Функция-обработчик изменения количества строк на странице. Обычно
обновляет состояние rowsPerPage и сбрасывает текущую
страницу на 0.
7. rowsPerPageOptions Список доступных
вариантов количества строк на странице. Можно передавать как массив
чисел, так и объекты с ключами label и value
для кастомного отображения.
import React, { useState } from 'react';
import Table from '@mui/material/Table';
import TableBody from '@mui/material/TableBody';
import TableCell from '@mui/material/TableCell';
import TableContainer from '@mui/material/TableContainer';
import TableHead from '@mui/material/TableHead';
import TableRow from '@mui/material/TableRow';
import TablePagination from '@mui/material/TablePagination';
import Paper from '@mui/material/Paper';
const rows = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 },
{ id: 3, name: 'Charlie', age: 22 },
// ...дополнительные данные
];
export default function PaginatedTable() {
const [page, setPage] = useState(0);
const [rowsPerPage, setRowsPerPage] = useState(5);
const handleChangePage = (event, newPage) => {
setPage(newPage);
};
const handleChangeRowsPerPage = (event) => {
setRowsPerPage(parseInt(event.target.value, 10));
setPage(0);
};
const paginatedRows = rows.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);
return (
<Paper>
<TableContainer>
<Table>
<TableHead>
<TableRow>
<TableCell>ID</TableCell>
<TableCell>Имя</TableCell>
<TableCell>Возраст</TableCell>
</TableRow>
</TableHead>
<TableBody>
{paginatedRows.map((row) => (
<TableRow key={row.id}>
<TableCell>{row.id}</TableCell>
<TableCell>{row.name}</TableCell>
<TableCell>{row.age}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
<TablePagination
component="div"
count={rows.length}
page={page}
onPageCha nge={handleChangePage}
rowsPerPage={rowsPerPage}
onRowsPerPageCha nge={handleChangeRowsPerPage}
rowsPerPageOptions={[5, 10, 25]}
/>
</Paper>
);
}
Стилизация элементов: Используется sx
для прямого изменения стилей или styled для создания
кастомного компонента. Пример:
<TablePagination
sx={{
bgcolor: 'grey.100',
'& .MuiTablePagination-toolbar': {
justifyContent: 'center',
},
}}
...
/>
Замена кнопок навигации: Можно передать собственный
компонент через ActionsComponent, чтобы изменить поведение
кнопок «следующая» и «предыдущая страница».
<TablePagination
ActionsComponent={CustomPaginationActions}
...
/>
Сброс страницы при изменении rowsPerPage: Чтобы
не получить пустую страницу при уменьшении количества строк на странице,
рекомендуется сбрасывать page в 0.
Оптимизация больших таблиц: При работе с
тысячами строк следует использовать серверную пагинацию с передачей
count и загрузкой только необходимого диапазона
данных.
Доступность (a11y): TablePagination
автоматически поддерживает aria-атрибуты для кнопок навигации, но при
кастомизации важно проверять доступность новых компонентов.
Для интеграции с сервером:
onPageChange) отправляется
запрос с параметрами page и rowsPerPage.count обновляется на основе общего числа
записей на сервере.Пример:
const fetchPageData = async (page, rowsPerPage) => {
const response = await fetch(`/api/users?page=${page + 1}&limit=${rowsPerPage}`);
const data = await response.json();
setRows(data.items);
setCount(data.totalCount);
};
Использование TablePagination обеспечивает удобный и
стандартизированный способ управления страницами в таблицах MUI,
позволяя как локальную, так и серверную пагинацию, с гибкой
кастомизацией и полной интеграцией с системой Material Design.