loadMoreInfinite.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import useSWRInfinite from "swr/infinite";
  2. export type TResponseData<D> = {
  3. data: D
  4. nextId?: string
  5. totalCount?: null | number
  6. pageIndex?: number
  7. pageSize?: number
  8. }
  9. export const createKey = (query: string, pageSize: number = 10, extra: Record<string, any> = []) => {
  10. return (pageIndex: number, previousPageData) => {
  11. // pageIndex 后端要求是从 1 开始
  12. if (pageIndex === 0)
  13. return [
  14. query,
  15. { nextId: undefined, pageSize, pageIndex: pageIndex + 1 },
  16. extra,
  17. ];
  18. // 如果是以 pageIndex 作为分页依据
  19. if (previousPageData && previousPageData.pageIndex && !previousPageData.nextId) {
  20. return [
  21. query,
  22. { pageSize, pageIndex: previousPageData.pageIndex + 1 },
  23. extra,
  24. ];
  25. }
  26. console.log(previousPageData.nextId, 77779)
  27. if (previousPageData && previousPageData.nextId) {
  28. return [
  29. query,
  30. { pageSize, nextId: previousPageData.nextId},
  31. extra,
  32. ];
  33. }
  34. return null;
  35. };
  36. }
  37. export const useLoadMoreInfinite = <T>(getKey, fetcher, params = {}) => {
  38. const { data, setSize, size, mutate, isLoading } = useSWRInfinite<{
  39. data: T
  40. nextId?: string
  41. totalCount?: null | number
  42. pageIndex?: number
  43. pageSize?: number
  44. }>(getKey, fetcher, {
  45. ...params,
  46. revalidateIfStale: false,
  47. revalidateFirstPage: false,
  48. onErrorRetry(err, key, config, revalidate, revalidateOpts) {
  49. if (err.status === 404) return
  50. if (err.status === 401) return
  51. if (revalidateOpts.retryCount >= 3) return
  52. },
  53. });
  54. // 扁平化后的数据列表
  55. const list = (data?.flatMap((page) => page?.data || []) || []) as T;
  56. // 原分页数据二维数组
  57. const pages = data
  58. const pageIndex = size
  59. const loadMore = () => {
  60. setSize((size) => size + 1);
  61. }
  62. return {
  63. data,
  64. list,
  65. pageIndex,
  66. isLoading,
  67. pages,
  68. mutate,
  69. setSize,
  70. loadMore,
  71. }
  72. }