import { useState, useCallback, useMemo, useEffect } from 'react'; import type { PagingData } from '../types/index'; import { IconButton, Flex, Box, Input } from '@chakra-ui/react'; import { ArrowBackIcon, ArrowForwardIcon } from '@chakra-ui/icons'; import { useMutation } from '@tanstack/react-query'; import { useToast } from './useToast'; export const usePagination = ({ api, pageSize = 10, params = {}, defaultRequest = true }: { api: (data: any) => any; pageSize?: number; params?: Record; defaultRequest?: boolean; }) => { const { toast } = useToast(); const [pageNum, setPageNum] = useState(1); const [total, setTotal] = useState(0); const [data, setData] = useState([]); const maxPage = useMemo(() => Math.ceil(total / pageSize) || 1, [pageSize, total]); const { mutate, isLoading } = useMutation({ mutationFn: async (num: number = pageNum) => { try { const res: PagingData = await api({ pageNum: num, pageSize, ...params }); setPageNum(num); res.total !== undefined && setTotal(res.total); setData(res.data); } catch (error: any) { toast({ title: error?.message || '获取数据异常', status: 'error' }); console.log(error); } return null; } }); const Pagination = useCallback(() => { return ( } aria-label={'left'} size={'sm'} w={'28px'} h={'28px'} onClick={() => mutate(pageNum - 1)} /> { const val = +e.target.value; if (val === pageNum) return; if (val >= maxPage) { mutate(maxPage); } else if (val < 1) { mutate(1); } else { mutate(+e.target.value); } }} /> / {maxPage} } aria-label={'left'} size={'sm'} w={'28px'} h={'28px'} onClick={() => mutate(pageNum + 1)} /> ); }, [maxPage, mutate, pageNum]); useEffect(() => { defaultRequest && mutate(1); }, []); return { pageNum, pageSize, total, data, isLoading, Pagination, getData: mutate }; };