use-pagination.ts 926 B

123456789101112131415161718192021222324252627282930
  1. import { useEffect, useState } from 'react';
  2. function usePagination(data: any[], itemsPerPage: number) {
  3. const [currentPage, setCurrentPage] = useState(1);
  4. const [maxPage, setMaxPage] = useState(Math.ceil(data.length / itemsPerPage));
  5. useEffect(() => setMaxPage(Math.ceil(data.length / itemsPerPage)), [data, itemsPerPage]);
  6. function currentData() {
  7. const begin = (currentPage - 1) * itemsPerPage;
  8. const end = begin + itemsPerPage;
  9. return data.slice(begin, end);
  10. }
  11. function next() {
  12. setCurrentPage((currentPage) => Math.min(currentPage + 1, maxPage));
  13. }
  14. function prev() {
  15. setCurrentPage((currentPage) => Math.max(currentPage - 1, 1));
  16. }
  17. function jump(page: number) {
  18. const pageNumber = Math.max(1, page);
  19. setCurrentPage((currentPage) => Math.min(pageNumber, maxPage));
  20. }
  21. return { next, prev, jump, currentData, currentPage, maxPage };
  22. }
  23. export default usePagination;