Zastosowania praktyczne: wyszukiwanie, przewijanie, zmiana rozmiaru
Proszę zastosować debounce dla pól wyszukiwania oraz throttle dla nasłuchiwaczy przewijania i zmiany rozmiaru w rzeczywistych przykładach komponentów.
Zastosowania praktyczne: wyszukiwanie, przewijanie, zmiana rozmiaru 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.
Wyszukiwanie na żywo z użyciem useDebounce
W komponencie wyszukiwania na żywo należy utrzymywać dwie oddzielne zmienne stanu: inputValue przechowującą surowe dane wejściowe (aktualizowaną przy każdym naciśnięciu klawisza, dzięki czemu pole pozostaje responsywne) oraz debouncedQuery pochodzącą z useDebounce(inputValue, 300) (aktualizowaną 300 ms po zakończeniu pisania i uruchamiającą wywołanie API). Taki podział zapewnia natychmiastową informację wizualną bez nadmiernej liczby żądań.
Stan ładowania podczas wyszukiwania
Wskaźnik ładowania należy wyświetlać od razu po rozpoczęciu pisania przez użytkownika, a nie dopiero po rozpoczęciu wywołania API. Należy ustawić isLoading: true, gdy tylko inputValue !== debouncedQuery — w czasie oczekiwania na debounce wartości te nie są zsynchronizowane. Po ustabilizowaniu się zapytania i zakończeniu pobierania należy ponownie ustawić tę wartość na false. Dzięki temu użytkownik przez cały czas widzi responsywny wskaźnik ładowania.
Obsługa przewijania z użyciem useThrottle
Efekt paralaksy lub pasek postępu czytania aktualizuje się na podstawie pozycji przewijania. Obsługę przewijania należy ograniczyć do maksymalnie 60 kl./s za pomocą opóźnienia 16 ms: const throttledScrollY = useThrottle(scrollY, 16). Interfejs aktualizuje się płynnie bez kosztownego ponownego obliczania pozycji przy każdym pikselu przewijania.
Zmiana rozmiaru okna z użyciem useDebounce
Nasłuchiwanie zmiany rozmiaru okna w celu ponownego obliczenia układu najlepiej realizować za pomocą debounce, a nie throttle. Obliczenia układu muszą zostać wykonane tylko raz, po zakończeniu zmiany rozmiaru. Należy użyć opóźnienia debounce wynoszącego 200 ms dla wymiarów okna. Podczas przeciągania w celu zmiany rozmiaru interfejs może wyświetlać uproszczony stan, a przeliczony układ pojawi się po zakończeniu zmiany rozmiaru.
Łączenie debounce z AbortController
Po zmianie debouncedQuery należy utworzyć nowy AbortController i przekazać jego signal do fetch(url, { signal }). Należy zwrócić funkcję czyszczącą, która wywołuje controller.abort(). Anuluje to żądanie będące w toku dla poprzedniego zapytania, gdy pojawi się nowe zapytanie po debounce, i zapobiega warunkom wyścigu, w których wolniejsza wcześniejsza odpowiedź nadpisuje szybszą późniejszą odpowiedź.
Warunek wyścigu bez AbortController
Bez AbortController, jeśli użytkownik wpisze "re", zaczeka, a następnie wpisze "react", drugie zapytanie może zwrócić wynik przed pierwszym (na przykład z powodu buforowania). Wyniki wyszukiwania najpierw wyświetlą wyniki dla React, a następnie zostaną nadpisane nieaktualnymi wynikami dla "re". AbortController zapobiega temu, całkowicie anulując wcześniejsze żądanie.
Wzorzec listy rozwijanej autouzupełniania
Lista rozwijana łączy debounce dla wywołań API z natychmiastowo aktualizowanym stanem wyświetlania pola wejściowego. inputValue steruje zawartością pola tekstowego. useDebounce(inputValue, 250) określa moment wysłania żądania pobrania sugestii. Lista sugestii jest renderowana na podstawie stanu pobranych wyników, który jest niezależny od obu stanów pola wejściowego.
Asynchroniczna walidacja z ograniczeniem częstotliwości
Asynchroniczną walidację formularza, na przykład sprawdzanie, czy dany adres e-mail już istnieje, należy poddawać debounce, aby uniknąć przeciążania serwera żądaniami przy każdym naciśnięciu klawisza. Należy zastosować debounce o opóźnieniu 400 ms dla wartości pola i wysyłać żądanie walidacji w komponencie useEffect zależnym od wartości po debounce. Podczas oczekiwania na zakończenie walidacji należy wyświetlać w polu wskaźnik ładowania.
Automatyczny zapis formularza z użyciem debounce
Debounce doskonale nadaje się do automatycznego zapisywania zawartości formularza podczas pisania. Należy ustawić debounce o opóźnieniu 1000 ms dla obiektu wartości formularza. Gdy wartość po debounce ulegnie zmianie, należy uruchomić zapis do localStorage lub punktu końcowego API. Podczas oczekiwania na debounce użytkownik widzi wskaźnik "Zapisywanie...", a po zakończeniu żądania — "Zapisano".
Wybór odpowiedniego opóźnienia
Wartości opóźnień są decyzjami dotyczącymi doświadczenia użytkownika. W przypadku wyszukiwania 200–300 ms zapewnia równowagę między responsywnością a zmniejszeniem liczby żądań. W przypadku zmiany rozmiaru 150–200 ms jest akceptowalne, ponieważ użytkownicy oczekują, że układ ustabilizuje się po zakończeniu zmiany rozmiaru. W przypadku automatycznego zapisu 1000 ms daje użytkownikowi czas na wpisanie zdania przed zapisaniem. Wartość należy dostosować do oczekiwanej szybkości interakcji.
Łączenie wielu technik
Rzeczywiste aplikacje często wymagają jednoczesnego zastosowania wielu optymalizacji. Edytor dokumentów może na przykład używać debounce do automatycznego zapisu (1 s), throttle do obliczania liczby słów (500 ms) oraz IntersectionObserver do analityki. Techniki te dobrze ze sobą współdziałają, ponieważ każda z nich działa niezależnie, na własnym zegarze i w swoim zakresie.
Łączenie debounce z AbortController
Dlaczego należy używać AbortController razem z zapytaniem wyszukiwania obsługiwanym przez debounce?
Podsumowanie lekcji: praktyczne zastosowanie debounce i throttle
Należy używać useDebounce dla pól wyszukiwania, obsługi zmiany rozmiaru i automatycznego zapisu formularza. useThrottle należy stosować podczas przewijania i poruszania myszą. Wywołania API obsługiwane przez debounce należy zawsze łączyć z AbortController, aby zapobiegać warunkom wyścigu. Stan ładowania należy wyświetlać zawsze, gdy inputValue !== debouncedQuery, aby interfejs pozostał responsywny i dostarczał użytkownikowi odpowiednich informacji.
Często zadawane pytania
Czy lekcja „Zastosowania praktyczne: wyszukiwanie, przewijanie, zmiana rozmiaru” jest bezpłatna?
Tak — pełny tekst „Zastosowania praktyczne: wyszukiwanie, przewijanie, zmiana rozmiaru” 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 „Zastosowania praktyczne: wyszukiwanie, przewijanie, zmiana rozmiaru”?
Proszę zastosować debounce dla pól wyszukiwania oraz throttle dla nasłuchiwaczy przewijania i zmiany rozmiaru w rzeczywistych przykładach komponentów. Ć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 „Zastosowania praktyczne: wyszukiwanie, przewijanie, zmiana rozmiaru”?
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
- Dlaczego debounce i throttle są ważne w interfejsach
- Implementowanie własnego hooka useDebounce
- Implementowanie własnego hooka useThrottle
- Zastosowania praktyczne: wyszukiwanie, przewijanie, zmiana rozmiaru