Как реализовать inifinite scroll с помощью RTK query

Пытаюсь реализвовать бесконечную прокрутку при помощи RTK query. Сейчас есть такой работающий код:

catApi.ts

import { Cat, QueryParams } from "@/app/types";
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";

type Headers = {
  "x-api-key": string;
};

const Headers: Headers = {
  "x-api-key": privateConfig.VITE_CAT_API_KEY,
};

const generateQueryStr = (baseString: string, query: QueryParams): string => {
  const queryString: string =
    baseString +
    Object.entries(query)
      .map(([key, value]) => `${key}=${value}`)
      .join("&");

  return queryString;
};

export const catApi = createApi({
  reducerPath: "catApi",
  baseQuery: fetchBaseQuery({
    baseUrl: "https://api.thecatapi.com/v1/",
    prepareHeaders: (headers) => {
      headers.set("x-api-key", Headers["x-api-key"]);

      return headers;
    },
  }),

  endpoints: (builder) => ({
    getCats: builder.query<Cat[], QueryParams>({
      query: (queryParams: QueryParams) => {
        const queryStr = generateQueryStr("images/search?", queryParams);

        return { url: queryStr };
      },
      serializeQueryArgs: ({ endpointName }) => {
        return endpointName;
      },
      merge: (currentCache, newItems) => {
        currentCache.push(...newItems);
      },
      // Refetch when the page arg changes
      forceRefetch({ currentArg, previousArg }) {
        return currentArg !== previousArg;
      },
    }),
  }),
});

export const { useGetCatsQuery } = catApi;

useInfiniteScroll.ts

import { useGetCatsQuery } from "@/features/cats";
import { useEffect, useState } from "react";

export const useInfiniteScroll = () => {
  const [page, setPage] = useState(0);

  const { data, isLoading, isFetching } = useGetCatsQuery({
    limit: 20,
    page,
    order: "ASC",
  });
  useEffect(() => {
    const onScroll = () => {
      const scrolledToBottom =
        window.innerHeight + window.scrollY >= document.body.offsetHeight;
      if (scrolledToBottom && !isFetching) {
        setPage(page + 1);
      }
    };

    document.addEventListener("scroll", onScroll);

    return () => {
      document.removeEventListener("scroll", onScroll);
    };
  }, [page, isFetching]);

  return { data, isLoading, isFetching };
};

Но проблема заключается в том, что если перейти на другую страницу, а потом вернуться страницу с бесконечным скроллом, то данные запрашиваются еще раз и добавляются к уже закэшированным данным. Просиходит это потому, что переменная page каждый раз изменяется на 0 при переходе на страницу. Есть у кого идеи, как этого избежать?


Ответы (0 шт):