Reference
Pagination
The Pagination component allows users to choose a specific page from a series of available pages.
Basic pagination
import * as React from 'react'; import Pagination from '@mui/material/Pagination'; import Stack from '@mui/material/Stack'; export default function BasicPagination() { return ( <Stack spacing={2}> <Pagination count={10} /> <Pagination count={10} color="primary" /> <Pagination count={10} color="secondary" /> <Pagination count={10} disabled /> </Stack> ); }
Outlined pagination
import * as React from 'react'; import Pagination from '@mui/material/Pagination'; import Stack from '@mui/material/Stack'; export default function PaginationOutlined() { return ( <Stack spacing={2}> <Pagination count={10} variant="outlined" /> <Pagination count={10} variant="outlined" color="primary" /> <Pagination count={10} variant="outlined" color="secondary" /> <Pagination count={10} variant="outlined" disabled /> </Stack> ); }
Rounded pagination
import * as React from 'react'; import Pagination from '@mui/material/Pagination'; import Stack from '@mui/material/Stack'; export default function PaginationRounded() { return ( <Stack spacing={2}> <Pagination count={10} shape="rounded" /> <Pagination count={10} variant="outlined" shape="rounded" /> </Stack> ); }
Pagination size
import * as React from 'react'; import Pagination from '@mui/material/Pagination'; import Stack from '@mui/material/Stack'; export default function PaginationSize() { return ( <Stack spacing={2}> <Pagination count={10} size="small" /> <Pagination count={10} /> <Pagination count={10} size="large" /> </Stack> ); }
Buttons
You can choose to include buttons for the first and last pages or deactivate the buttons for the previous and next pages.
import * as React from 'react'; import Pagination from '@mui/material/Pagination'; import Stack from '@mui/material/Stack'; export default function PaginationButtons() { return ( <Stack spacing={2}> <Pagination count={10} showFirstButton showLastButton /> <Pagination count={10} hidePrevButton hideNextButton /> </Stack> ); }
Custom icons
The control icons can be customized as needed.
import * as React from 'react'; import Pagination from '@mui/material/Pagination'; import PaginationItem from '@mui/material/PaginationItem'; import Stack from '@mui/material/Stack'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import ArrowForwardIcon from '@mui/icons-material/ArrowForward'; export default function CustomIcons() { return ( <Stack spacing={2}> <Pagination count={10} renderItem={(item) => ( <PaginationItem slots={{ previous: ArrowBackIcon, next: ArrowForwardIcon }} {...item} /> )} /> </Stack> ); }
Pagination ranges
You can define the number of digits shown on either side of the current page using the
siblingCount
prop, and near the start and end page numbers with the boundaryCount
prop.import * as React from 'react'; import Pagination from '@mui/material/Pagination'; import Stack from '@mui/material/Stack'; export default function PaginationRanges() { return ( <Stack spacing={2}> <Pagination count={11} defaultPage={6} siblingCount={0} /> <Pagination count={11} defaultPage={6} /> {/* Default ranges */} <Pagination count={11} defaultPage={6} siblingCount={0} boundaryCount={2} /> <Pagination count={11} defaultPage={6} boundaryCount={2} /> </Stack> ); }
Controlled pagination
Page: 1
import * as React from 'react'; import Typography from '@mui/material/Typography'; import Pagination from '@mui/material/Pagination'; import Stack from '@mui/material/Stack'; export default function PaginationControlled() { const [page, setPage] = React.useState(1); const handleChange = (event: React.ChangeEvent<unknown>, value: number) => { setPage(value); }; return ( <Stack spacing={2}> <Typography>Page: {page}</Typography> <Pagination count={10} page={page} onChange={handleChange} /> </Stack> ); }
usePagination
For advanced customization scenarios, the headless
usePagination()
hook is provided. It accepts nearly the same options as the Pagination component, excluding props related to JSX rendering. The Pagination component is built using this hook.import usePagination from '@mui/material/usePagination';
import * as React from 'react'; import usePagination from '@mui/material/usePagination'; import { styled } from '@mui/material/styles'; const List = styled('ul')({ listStyle: 'none', padding: 0, margin: 0, display: 'flex', }); export default function UsePagination() { const { items } = usePagination({ count: 10, }); return ( <nav> <List> {items.map(({ page, type, selected, ...item }, index) => { let children = null; if (type === 'start-ellipsis' || type === 'end-ellipsis') { children = '…'; } else if (type === 'page') { children = ( <button type="button" style={{ fontWeight: selected ? 'bold' : undefined, }} {...item} > {page} </button> ); } else { children = ( <button type="button" {...item}> {type} </button> ); } return <li key={index}>{children}</li>; })} </List> </nav> ); }
Table pagination
The
Pagination
component is designed to navigate through a list of items when infinite loading is not utilized. It is ideal for scenarios where SEO matters, such as a blog.For paginating large datasets in a table, the
TablePagination
component is recommended.import * as React from 'react'; import TablePagination from '@mui/material/TablePagination'; export default function TablePaginationDemo() { const [page, setPage] = React.useState(2); const [rowsPerPage, setRowsPerPage] = React.useState(10); const handleChangePage = ( event: React.MouseEvent<HTMLButtonElement> | null, newPage: number, ) => { setPage(newPage); }; const handleChangeRowsPerPage = ( event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>, ) => { setRowsPerPage(parseInt(event.target.value, 10)); setPage(0); }; return ( <TablePagination component="div" count={100} page={page} onPageChange={handleChangePage} rowsPerPage={rowsPerPage} onRowsPerPageChange={handleChangeRowsPerPage} /> ); }
:::warning Be aware that the
Pagination
page prop begins at 1 to align with URL inclusion requirements, whereas the TablePagination
page prop starts at 0 to match the zero-based indexing of JavaScript arrays used for rendering large tabular datasets. :::You can explore this use case further in the table section of the documentation.
Accessibility
ARIA
The root node is assigned a "navigation" role and an aria-label of "pagination navigation" by default. Page items include an aria-label indicating their purpose (e.g., "go to first page", "go to previous page", "go to page 1"). These can be customized using the
getItemAriaLabel
prop.Keyboard
Pagination items are accessible via keyboard, each with a tabindex of "0".