index.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import {useInfiniteQuery, useQueryClient} from '@tanstack/react-query';
  2. import {useReady} from '@tarojs/taro';
  3. import {useState, useRef, useLayoutEffect} from 'react';
  4. export function useInfiniteFetch({key, fn, limit: propsLimit, params}) {
  5. const [enabled, setEnabled] = useState(false);
  6. const page = useRef(1);
  7. const limit = propsLimit ?? '10';
  8. useLayoutEffect(
  9. function () {
  10. page.current = 1;
  11. },
  12. // eslint-disable-next-line react-hooks/exhaustive-deps
  13. key,
  14. );
  15. const {
  16. data,
  17. fetchNextPage,
  18. isFetching,
  19. isFetchingNextPage,
  20. hasNextPage,
  21. refetch,
  22. } = useInfiniteQuery(
  23. key,
  24. async function () {
  25. const result = await fn({page: page.current, limit, ...params});
  26. result.code === '200' && result.data.list.length > 0 && page.current++;
  27. return result;
  28. },
  29. {
  30. enabled,
  31. cacheTime: 0,
  32. select(data) {
  33. const list = data.pages
  34. .map(function (val) {
  35. return val.data.list;
  36. })
  37. .filter(val => val.length > 0);
  38. return {pageParams: data.pageParams, pages: list.flat(2)};
  39. },
  40. getNextPageParam(last) {
  41. if (!last) return false;
  42. return last.data.hasNextPage;
  43. },
  44. },
  45. );
  46. useReady(function () {
  47. setTimeout(() => setEnabled(true), 50);
  48. });
  49. const isEmpty =
  50. page.current === 1 && !data?.pages.length && !isFetching && !hasNextPage;
  51. const queryClient = useQueryClient();
  52. function refresh() {
  53. if (isFetching) return;
  54. page.current = 1;
  55. refetch({refetchPage: (_, index) => index === 0}).then(function () {
  56. queryClient.setQueriesData(key, function (data) {
  57. const firstData = data?.pages[0];
  58. return {
  59. pageParams: data.pageParams,
  60. pages: [firstData],
  61. };
  62. });
  63. });
  64. }
  65. return [
  66. {data, isFetching, isFetchingNextPage, hasNextPage, isEmpty},
  67. {fetchNextPage, refresh},
  68. ];
  69. }