生产管理系统前端 - 地块档案管理页面开发
This commit is contained in:
78
crop-x/src/lib/usePagination.ts
Normal file
78
crop-x/src/lib/usePagination.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import { useState, useMemo } from 'react';
|
||||
|
||||
export interface PaginationConfig {
|
||||
currentPage: number;
|
||||
pageSize: number;
|
||||
total: number;
|
||||
}
|
||||
|
||||
export interface UsePaginationReturn<T> {
|
||||
currentPage: number;
|
||||
pageSize: number;
|
||||
totalPages: number;
|
||||
paginatedData: T[];
|
||||
goToPage: (page: number) => void;
|
||||
nextPage: () => void;
|
||||
previousPage: () => void;
|
||||
setPageSize: (size: number) => void;
|
||||
canPreviousPage: boolean;
|
||||
canNextPage: boolean;
|
||||
startIndex: number;
|
||||
endIndex: number;
|
||||
}
|
||||
|
||||
export function usePagination<T>(
|
||||
data: T[],
|
||||
initialPageSize: number = 10
|
||||
): UsePaginationReturn<T> {
|
||||
const [currentPage, setCurrentPage] = useState(1);
|
||||
const [pageSize, setPageSize] = useState(initialPageSize);
|
||||
|
||||
const totalPages = Math.ceil(data.length / pageSize);
|
||||
|
||||
const paginatedData = useMemo(() => {
|
||||
const startIndex = (currentPage - 1) * pageSize;
|
||||
const endIndex = startIndex + pageSize;
|
||||
return data.slice(startIndex, endIndex);
|
||||
}, [data, currentPage, pageSize]);
|
||||
|
||||
const goToPage = (page: number) => {
|
||||
const pageNumber = Math.max(1, Math.min(page, totalPages));
|
||||
setCurrentPage(pageNumber);
|
||||
};
|
||||
|
||||
const nextPage = () => {
|
||||
if (currentPage < totalPages) {
|
||||
setCurrentPage(currentPage + 1);
|
||||
}
|
||||
};
|
||||
|
||||
const previousPage = () => {
|
||||
if (currentPage > 1) {
|
||||
setCurrentPage(currentPage - 1);
|
||||
}
|
||||
};
|
||||
|
||||
const handleSetPageSize = (size: number) => {
|
||||
setPageSize(size);
|
||||
setCurrentPage(1); // 重置到第一页
|
||||
};
|
||||
|
||||
const startIndex = (currentPage - 1) * pageSize + 1;
|
||||
const endIndex = Math.min(currentPage * pageSize, data.length);
|
||||
|
||||
return {
|
||||
currentPage,
|
||||
pageSize,
|
||||
totalPages,
|
||||
paginatedData,
|
||||
goToPage,
|
||||
nextPage,
|
||||
previousPage,
|
||||
setPageSize: handleSetPageSize,
|
||||
canPreviousPage: currentPage > 1,
|
||||
canNextPage: currentPage < totalPages,
|
||||
startIndex,
|
||||
endIndex,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user