19. Table: пагинация
Подключение пагинации
Заголовок раздела «Подключение пагинации»import { getPaginationRowModel, type PaginationState } from '@tanstack/react-table'
const [pagination, setPagination] = useState<PaginationState>({ pageIndex: 0, // Начинается с 0! pageSize: 10,})
const table = useReactTable({ data, columns, state: { pagination }, onPaginationChange: setPagination, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), // Добавляем! rowCount: totalRows, // Для серверной пагинации})PaginationState
Заголовок раздела «PaginationState»pagination = { pageIndex: 0, // Текущая страница (0-based) pageSize: 10, // Строк на странице}Методы таблицы для пагинации
Заголовок раздела «Методы таблицы для пагинации»table.getPageCount() // Общее количество страницtable.getCanPreviousPage() // Можно ли перейти назадtable.getCanNextPage() // Можно ли перейти вперёдtable.previousPage() // Перейти на предыдущую страницуtable.nextPage() // Перейти на следующую страницуtable.firstPage() // Перейти на первую страницуtable.lastPage() // Перейти на последнюю страницуtable.setPageIndex(n) // Перейти на страницу ntable.setPageSize(n) // Изменить размер страницыtable.getState().pagination // Текущее состояние пагинацииКомпонент управления пагинацией
Заголовок раздела «Компонент управления пагинацией»function Pagination({ table }: { table: Table<any> }) { const { pageIndex, pageSize } = table.getState().pagination
return ( <div> <button onClick={() => table.firstPage()} disabled={!table.getCanPreviousPage()}>«</button> <button onClick={() => table.previousPage()} disabled={!table.getCanPreviousPage()}>‹</button>
<span> Страница {pageIndex + 1} из {table.getPageCount()} </span>
<button onClick={() => table.nextPage()} disabled={!table.getCanNextPage()}>›</button> <button onClick={() => table.lastPage()} disabled={!table.getCanNextPage()}>»</button>
<select value={pageSize} onChange={(e) => table.setPageSize(Number(e.target.value))}> {[5, 10, 20, 50].map(size => ( <option key={size} value={size}>{size} строк</option> ))} </select> </div> )}Серверная пагинация
Заголовок раздела «Серверная пагинация»Для серверной пагинации добавьте manualPagination: true:
const table = useReactTable({ data, // Только текущая страница! columns, rowCount: totalRows, // Общее количество строк на сервере state: { pagination }, onPaginationChange: (newPagination) => { setPagination(newPagination) // Запрашиваем данные с сервера fetchData({ page: newPagination.pageIndex, pageSize: newPagination.pageSize, }) }, manualPagination: true, // Отключаем клиентскую пагинацию getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(),})