MUI (Material-UI) предоставляет компонент Pagination, который позволяет удобно реализовать постраничный вывод данных. Основная задача пагинации — разбивать длинные списки элементов на страницы, улучшая читаемость и производительность интерфейса.
Базовое подключение компонента выглядит следующим образом:
import Pagination from '@mui/material/Pagination';
import Stack from '@mui/material/Stack';
<Stack spacing={2}>
<Pagination count={10} />
</Stack>
text или
outlined).primary,
secondary, standard).Компонент можно интегрировать с состоянием React для управления текущей страницей:
import { useState } from 'react';
import Pagination from '@mui/material/Pagination';
function ControlledPagination() {
const [page, setPage] = useState(1);
const handleChange = (event, value) => {
setPage(value);
// логика загрузки данных для выбранной страницы
};
return <Pagination count={20} page={page} onCha nge={handleChange} />;
}
MUI позволяет детально настраивать внешний вид:
small,
medium, large).circular,
rounded).Пример комплексной настройки:
<Pagination
count={50}
page={page}
onCha nge={handleChange}
variant="outlined"
color="secondary"
size="large"
shape="rounded"
siblingCount={1}
boundaryCount={2}
/>
Часто пагинация используется совместно с компонентами Table и DataGrid для работы с большими наборами данных. В MUI DataGrid встроена поддержка пагинации через свойства:
Пример с DataGrid:
import { DataGrid } from '@mui/x-data-grid';
import { useState } from 'react';
function PaginatedDataGrid({ rows, columns }) {
const [pageSize, setPageSize] = useState(10);
const [page, setPage] = useState(0);
return (
<DataGrid
rows={rows}
columns={columns}
pagination
pageSize={pageSize}
rowsPerPageOptions={[5, 10, 20]}
onPageCha nge={(newPage) => setPage(newPage)}
onPageSizeCha nge={(newSize) => setPageSize(newSize)}
page={page}
/>
);
}
При работе с большими данными часто требуется серверная пагинация. Вместо загрузки всех данных сразу, компонент получает только данные для текущей страницы:
import { useState, useEffect } from 'react';
import Pagination from '@mui/material/Pagination';
import axios from 'axios';
function ServerPagination() {
const [page, setPage] = useState(1);
const [data, setData] = useState([]);
const [totalPages, setTotalPages] = useState(0);
useEffect(() => {
axios.get(`/api/items?page=${page}`)
.then(response => {
setData(response.data.items);
setTotalPages(response.data.totalPages);
});
}, [page]);
return (
<>
<div>
{data.map(item => <div key={item.id}>{item.name}</div>)}
</div>
<Pagination
count={totalPages}
page={page}
onCha nge={(event, value) => setPage(value)}
/>
</>
);
}
Ключевой момент — корректная синхронизация текущей страницы с серверным API и обновление данных при смене страницы.
Для современных интерфейсов иногда используют lazy loading, когда новые страницы подгружаются при скролле. MUI Pagination можно комбинировать с библиотеками вроде react-infinite-scroll-component, отображая кнопку перехода на следующую страницу или автоматически подгружая данные.
import InfiniteScroll from 'react-infinite-scroll-component';
<InfiniteScroll
dataLength={data.length}
next={loadNextPage}
hasMore={page < totalPages}
loader={<h4>Loading...</h4>}
>
{data.map(item => <div key={item.id}>{item.name}</div>)}
</InfiniteScroll>
Компонент Pagination поддерживает
ARIA-атрибуты, что важно для доступности. Также можно
использовать getItemAriaLabel для задания собственного
текста для кнопок страниц:
<Pagination
count={10}
getItemAriaLabel={(type, page, selected) => {
if (type === 'page') return `Перейти на страницу ${page}`;
return `Кнопка ${type}`;
}}
/>
siblingCount и boundaryCount
для улучшения UX при большом количестве страниц.Эти практики позволяют создавать эффективные и удобные интерфейсы с большим объемом данных, полностью используя возможности MUI.