import React from 'react'; import { useSearchParams } from 'react-router-dom'; interface PaginationProps { total: number; totalPages: number; currentPage: number; onPageChange?: (page: number) => void; showTotal?: boolean; scrollToTop?: boolean; pageSize?: number; pageSizeOptions?: number[]; onPageSizeChange?: (size: number) => void; } const Pagination: React.FC = ({ total, totalPages, currentPage, onPageChange, showTotal = true, scrollToTop = true, pageSize = 10, pageSizeOptions = [], onPageSizeChange, }) => { const [searchParams, setSearchParams] = useSearchParams(); // 更新 URL 页码的辅助函数 const updatePageInUrl = (page: number) => { setSearchParams(prev => { const newParams = new URLSearchParams(prev); if (page === 1) { newParams.delete('page'); } else { newParams.set('page', page.toString()); } return newParams; }); // 如果提供了自定义的 onPageChange 回调,也调用它 if (onPageChange) onPageChange(page); // 滚动到顶部 if (scrollToTop) { const mainElement = document.querySelector('main'); if (mainElement) { mainElement.scrollTop = 0; } } }; // 如果只有一页,不显示分页 if (totalPages <= 1 && (!pageSizeOptions || pageSizeOptions.length === 0)) { return null; } // 生成页码数组 const generatePages = (): (number | string)[] => { const pages: (number | string)[] = []; if (totalPages <= 7) { // 如果总页数少于等于7,显示所有页码 for (let i = 1; i <= totalPages; i++) { pages.push(i); } } else { // 如果总页数大于7,显示带省略号的页码 if (currentPage <= 3) { // 当前页在前3页 for (let i = 1; i <= 4; i++) { pages.push(i); } pages.push('...'); pages.push(totalPages); } else if (currentPage >= totalPages - 2) { // 当前页在后3页 pages.push(1); pages.push('...'); for (let i = totalPages - 3; i <= totalPages; i++) { pages.push(i); } } else { // 当前页在中间 pages.push(1); pages.push('...'); for (let i = currentPage - 1; i <= currentPage + 1; i++) { pages.push(i); } pages.push('...'); pages.push(totalPages); } } return pages; }; const pages = generatePages(); return (
{showTotal && ( 共{total}条 )} {pageSizeOptions && pageSizeOptions.length > 0 && (
每页
)}
{pages.map((page, index) => { if (page === '...') { return ( ); } const pageNum = page as number; return ( ); })}
); }; export default Pagination;