0Pricing
React Academy · Lekcja

Nieskończone przewijanie i paginacja z useInfiniteQuery

Pobieranie danych podzielonych na strony i płynne ładowanie kolejnych stron za pomocą useInfiniteQuery.

Nieskończone przewijanie i paginacja z useInfiniteQuery to bezpłatna lekcja React Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Wprowadzenie

W tej lekcji użyją Państwo useInfiniteQuery do pobierania danych podzielonych na strony i zaimplementują wzorzec nieskończonego przewijania, który ładuje kolejne strony podczas przewijania przez użytkownika.

Czym jest useInfiniteQuery?

useInfiniteQuery pobiera dane w postaci „pages”. Każda strona jest pobierana osobno i dołączana do listy zapisanej w pamięci podręcznej. Hook udostępnia narzędzia fetchNextPage, hasNextPage oraz isFetchingNextPage.

Podstawowa konfiguracja

Zdefiniuj initialPageParam i getNextPageParam. Funkcja queryFn otrzymuje bieżący pageParam i musi zwrócić stronę wyników.
const { data, fetchNextPage, hasNextPage } = useInfiniteQuery({
  queryKey: ['posts'],
  queryFn: ({ pageParam }) =>
    fetch('/api/posts?cursor=' + pageParam).then(r => r.json()),
  initialPageParam: 0,
  getNextPageParam: (lastPage) => lastPage.nextCursor ?? undefined,
});

getNextPageParam

getNextPageParam otrzymuje ostatnią pobraną stronę oraz wszystkie strony. Zwróć kursor lub numer następnej strony albo undefined/null, aby zasygnalizować brak kolejnych stron (ustawia hasNextPage na false).
getNextPageParam: (lastPage, allPages) => {
  return lastPage.hasMore ? lastPage.nextCursor : undefined;
}

Renderowanie wszystkich stron

data.pages to tablica wyników poszczególnych stron. Spłaszcz ją, aby wyświetlić wszystkie elementy jako jedną ciągłą listę.
const allPosts = data.pages.flatMap(page => page.items);

return (
  <ul>
    {allPosts.map(post => <li key={post.id}>{post.title}</li>)}
  </ul>
);

Przycisk ładowania kolejnych elementów

Dodaj przycisk „Załaduj więcej”, który wywołuje fetchNextPage. Wyłącz go, gdy nie ma już kolejnych stron lub trwa pobieranie.
<button
  onClick={() => fetchNextPage()}
  disabled={!hasNextPage || isFetchingNextPage}
>
  {isFetchingNextPage ? 'Loading...' : hasNextPage ? 'Load More' : 'No more posts'}
</button>

Nieskończone przewijanie z użyciem IntersectionObserver

Dołącz IntersectionObserver do elementu div pełniącego funkcję znacznika na dole listy. Gdy znajdzie się on w obszarze widocznym, automatycznie wywołaj fetchNextPage.
const observerRef = useRef();
useEffect(() => {
  const observer = new IntersectionObserver(entries => {
    if (entries[0].isIntersecting && hasNextPage) fetchNextPage();
  });
  if (observerRef.current) observer.observe(observerRef.current);
  return () => observer.disconnect();
}, [hasNextPage, fetchNextPage]);

<div ref={observerRef} />  {/* sentinel at bottom */}

Dwukierunkowe nieskończone przewijanie

W aplikacjach czatu obsłuż przewijanie w obu kierunkach: użyj fetchNextPage dla starszych wiadomości oraz getPreviousPageParam/fetchPreviousPage dla nowszych wiadomości.

Paginacja oparta na numerach stron a paginacja oparta na kursorze

Paginacja offsetowa lub oparta na numerach stron: initialPageParam=1, a getNextPageParam zwraca lastPage.page + 1. Paginacja oparta na kursorze: użyj identyfikatora ostatniego elementu jako kursora. Paginacja kursorowa jest stabilniejsza w przypadku dynamicznie zmieniających się danych.
// Offset-based
getNextPageParam: (lastPage) => lastPage.page + 1

Ponowne pobieranie zapytań nieskończonych

Wywołanie invalidateQueries dla zapytania nieskończonego ponownie pobiera tylko pierwszą stronę. Aby ponownie pobrać wszystkie strony (np. po dodaniu nowego posta), użyj queryClient.resetQueries lub refetchType: 'all'.

Szybki sprawdzian

Co musi zwrócić getNextPageParam, aby zasygnalizować, że nie ma już stron do załadowania?

Podsumowanie

useInfiniteQuery gromadzi strony w data.pages. Użyj flatMap, aby je spłaszczyć i wyświetlić. Zwracaj undefined z getNextPageParam, aby zatrzymać pobieranie. Wywołuj fetchNextPage po kliknięciu przycisku lub za pomocą IntersectionObserver, aby uzyskać nieskończone przewijanie.

Ukończenie kursu

Gratulacje! Ukończono kurs **React Query: Server State Management**. Potrafisz już pobierać, buforować, modyfikować i stronicować dane oraz implementować nieskończone przewijanie za pomocą TanStack Query.

Często zadawane pytania

Czy lekcja „Nieskończone przewijanie i paginacja z useInfiniteQuery” jest bezpłatna?

Tak — pełny tekst „Nieskończone przewijanie i paginacja z useInfiniteQuery” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Nieskończone przewijanie i paginacja z useInfiniteQuery”?

Pobieranie danych podzielonych na strony i płynne ładowanie kolejnych stron za pomocą useInfiniteQuery. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Nieskończone przewijanie i paginacja z useInfiniteQuery”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Konfiguracja React Query i QueryClient
  2. Buforowanie, czas nieaktualności i odświeżanie w tle
  3. Mutacje z useMutation
  4. Nieskończone przewijanie i paginacja z useInfiniteQuery
← Powrót do React Academy