React Academy · Lekcja

Selektory i zapobieganie zbędnym ponownym renderowaniom

Wybieranie określonych fragmentów stanu za pomocą selektorów, aby komponenty renderowały się ponownie tylko wtedy, gdy jest to potrzebne.

Lekcja 2 z 413 kroki

Selektory i zapobieganie zbędnym ponownym renderowaniom to bezpłatna lekcja React Academy na CoddyKit. To lekcja 2 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.

Witamy

W tej lekcji użyjesz selektorów Zustand, aby subskrybować komponenty tylko do potrzebnych im fragmentów stanu i zapobiegać niepotrzebnym ponownym renderowaniom, gdy zmieniają się inne części store'a.

Problem domyślnego selektora

Wywołanie hooka store'a bez selektora zwraca cały obiekt store'a. Komponent jest ponownie renderowany przy KAŻDEJ zmianie store'a, nawet gdy zmienia się niezwiązany z nim fragment stanu.
// Bad: re-renders on every store change
const store = useAppStore();
return <p>{store.user.name}</p>;

Używanie selektora

Przekaż funkcję selektora do hooka store'a. Komponent zostanie ponownie wyrenderowany tylko wtedy, gdy zmieni się wartość zwracana przez selektor.
// Good: re-renders only when user.name changes
const name = useAppStore(s => s.user.name);
return <p>{name}</p>;

Sprawdzanie równości referencji

Zustand domyślnie używa ścisłego porównania (===). Jeśli selektor zwraca nowy obiekt lub tablicę przy każdym wywołaniu, komponent zostanie ponownie wyrenderowany nawet wtedy, gdy zawartość pozostaje taka sama.
// Creates a new object every time — always re-renders!
const info = useStore(s => ({ id: s.id, name: s.name }));

Naprawa za pomocą płytkiego porównania

Zaimportuj `shallow` z zustand i przekaż go jako funkcję porównującą, aby uniknąć ponownych renderowań, gdy zawartość obiektu pozostaje taka sama.
import { shallow } from 'zustand/shallow';

const info = useAppStore(
  s => ({ id: s.id, name: s.name }),
  shallow // compare by content, not reference
);

Wybieranie wielu wartości

Użyj wzorca płytkiego porównania, aby wybrać wiele wartości naraz bez powodowania niepotrzebnych ponownych renderowań.
const { items, loading } = useCartStore(
  s => ({ items: s.items, loading: s.loading }),
  shallow
);

Stabilne referencje akcji

Akcje, czyli funkcje w Zustand, mają stabilne referencje — nie zmieniają się podczas aktualizacji stanu. Możesz wybierać je bez shallow, a nie będą powodować ponownych renderowań.
// Actions are always stable — no shallow needed
const addToCart = useCartStore(s => s.addToCart);

Pomocniczy useShallow (Zustand v5+)

Zustand v5 udostępnia narzędzie useShallow, które automatycznie opakowuje selektor w płytkie porównanie, dzięki czemu kod jest czytelniejszy.
import { useShallow } from 'zustand/react/shallow';

const { items, loading } = useCartStore(
  useShallow(s => ({ items: s.items, loading: s.loading }))
);

Łączenie selektorów

Wyprowadzaj obliczane wartości wewnątrz selektorów, aby uniknąć przechowywania w store'ze stanu pochodnego. W selektorze obliczaj sumy, przefiltrowane listy lub sformatowane ciągi znaków.
const totalPrice = useCartStore(
  s => s.items.reduce((sum, item) => sum + item.price, 0)
);

Profilowanie ponownych renderowań Zustand

Użyj profilera React DevTools, aby sprawdzić działanie selektorów. Po dodaniu do store'a niezwiązanego elementu sprawdź, czy komponent używający wyłącznie selektora name NIE pojawia się na wykresie płomieniowym commitów.

Szybkie sprawdzenie

Dlaczego trzeba używać płytkiego porównania, gdy selektor Zustand zwraca obiekt?

Podsumowanie

Zawsze używaj konkretnych selektorów. Stosuj płytkie porównanie podczas wybierania wielu wartości jako obiektu. Wyprowadzaj obliczane wartości wewnątrz selektorów. Akcje mają stabilne referencje i nie wymagają shallow.

Dalej

Następna lekcja: **Trwałe przechowywanie stanu za pomocą middleware persist** — zsynchronizujesz stan Zustand z localStorage za pomocą middleware persist.
Bezpłatny start

Ucz się React dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
88
Lekcje
324

Często zadawane pytania

Czy lekcja „Selektory i zapobieganie zbędnym ponownym renderowaniom” jest bezpłatna?

Tak — pełny tekst „Selektory i zapobieganie zbędnym ponownym renderowaniom” 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 „Selektory i zapobieganie zbędnym ponownym renderowaniom”?

Wybieranie określonych fragmentów stanu za pomocą selektorów, aby komponenty renderowały się ponownie tylko wtedy, gdy jest to potrzebne. Ć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 2 z 4.

Ile czasu zajmuje lekcja „Selektory i zapobieganie zbędnym ponownym renderowaniom”?

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. Tworzenie pierwszego store Zustand
  2. Selektory i zapobieganie zbędnym ponownym renderowaniom
  3. Utrwalanie stanu za pomocą middleware persist
  4. Zustand DevTools i testowanie store'ów
← Powrót do React Academy