import clsx from 'clsx' import { ChevronLeft, ChevronRight } from 'lucide-react' interface PaginationProps { page: number // 当前页(1-based) pageSize: number // 每页条数 total: number // 总条数 onPageChange: (page: number) => void onPageSizeChange?: (size: number) => void pageSizeOptions?: number[] } export default function Pagination({ page, pageSize, total, onPageChange, onPageSizeChange, pageSizeOptions = [10, 20, 50], }: PaginationProps) { const totalPages = Math.max(1, Math.ceil(total / pageSize)) const start = total === 0 ? 0 : (page - 1) * pageSize + 1 const end = Math.min(page * pageSize, total) // 生成页码按钮(最多显示 7 个) const pages: (number | '...')[] = [] if (totalPages <= 7) { for (let i = 1; i <= totalPages; i++) pages.push(i) } else { pages.push(1) if (page > 3) pages.push('...') const s = Math.max(2, page - 1) const e = Math.min(totalPages - 1, page + 1) for (let i = s; i <= e; i++) pages.push(i) if (page < totalPages - 2) pages.push('...') pages.push(totalPages) } return (
{/* 左侧:条数信息 + 每页条数选择 */}
共 {total} 条 {onPageSizeChange && ( )} 第 {start}-{end} 条
{/* 右侧:页码导航 */}
{pages.map((p, i) => p === '...' ? ( ) : ( ), )}
) }