0Pricing
React Academy · Lekcja

Wzorzec selektora kontekstu

Implementacja prostego hooka selektora, który powoduje ponowne renderowanie tylko wtedy, gdy zmieni się fragment kontekstu.

Wzorzec selektora kontekstu to bezpłatna lekcja React Academy na CoddyKit. To lekcja 3 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 zaimplementuje Pani/Pan hook selektora kontekstu, który subskrybuje komponent tylko na określony fragment stanu kontekstu, zapobiegając ponownemu renderowaniu przy zmianach niezwiązanych z tym fragmentem.

Problem selektora

useContext powoduje ponowne renderowanie, gdy zmieni się DOWOLNA część kontekstu. Jeśli komponent potrzebuje tylko imienia użytkownika, ale kontekst zawiera również listę powiadomień, dodanie powiadomienia niepotrzebnie spowoduje ponowne renderowanie komponentu wyświetlającego imię.

Czym jest selektor

Selektor to funkcja, która wyodrębnia konkretny fragment stanu z większego obiektu stanu: `state => state.user.name`. Hook selektora subskrybuje kontekst, ale powoduje ponowne renderowanie tylko wtedy, gdy zmieni się wybrana wartość.

Prosty hook selektora

Należy zbudować hook useSelector, który odczytuje kontekst i opakowuje go w useMemo zależne od wyniku selektora. Komponent renderuje się ponownie tylko wtedy, gdy zmieni się wybrana wartość.
function useAppSelector(selector) {
  const state = useContext(AppCtx);
  return useMemo(() => selector(state), [state, selector]);
}

// Consumer only re-renders when user.name changes
const name = useAppSelector(s => s.user.name);

Płytkie porównywanie równości

useMemo z selektorem nadal powoduje ponowne renderowanie, jeśli selektor przy każdym wywołaniu zwraca nową referencję obiektu lub tablicy, na przykład `s => s.items.filter(...)`. Należy użyć porównania płytkiego, aby pomijać ponowne renderowanie, gdy zawartość pozostaje taka sama.
import { useRef } from 'react';

function useSelector(selector) {
  const state = useContext(AppCtx);
  const selected = selector(state);
  const ref = useRef(selected);
  if (!shallowEqual(ref.current, selected)) {
    ref.current = selected;
  }
  return ref.current;
}

Biblioteka use-context-selector

W zastosowaniach produkcyjnych biblioteka **use-context-selector** udostępnia hook useContextSelector z wydajną subskrypcją i sprawdzaniem równości, bez konieczności używania zewnętrznych menedżerów stanu.
import { useContextSelector } from 'use-context-selector';

const name = useContextSelector(AppCtx, s => s.user.name);

Zustand jako rozwiązanie natywnie obsługujące selektory

Hook `useStore(selector)` biblioteki Zustand ma wbudowaną obsługę selektorów oraz porównywanie płytkie dostępne od razu, dzięki czemu dobrze sprawdza się w przypadku dużych drzew stanu, w których ważne są szczegółowe subskrypcje.
const name = useAppStore(state => state.user.name);

Kiedy selektory są przesadą

Jeśli kontekst aktualizuje się rzadko, a komponenty korzystające z niego renderują się ponownie niewielkim kosztem, selektory zwiększają złożoność bez mierzalnych korzyści. Najpierw należy wykonać profilowanie — optymalizację należy zawsze opierać na dowodach.

Memoizacja funkcji selektora

Jeśli selektor zostanie utworzony bezpośrednio w treści komponentu, przy każdym renderowaniu otrzyma nową referencję funkcji, co może przerwać memoizację. Selektory należy definiować poza komponentem lub użyć useCallback.
// Outside component — stable reference
const selectName = s => s.user.name;

function Profile() {
  const name = useAppSelector(selectName);
  return <p>{name}</p>;
}

Selektory pochodne

Selektory można łączyć, wywołując jeden wewnątrz drugiego. Selektory pochodne obliczają wartości na podstawie selektorów bazowych, dzięki czemu logika biznesowa pozostaje poza komponentami.
const selectFullName = s => s.user.firstName + ' ' + s.user.lastName;

Szybkie sprawdzenie

Dlaczego funkcje selektorów należy definiować poza treścią komponentu, gdy są używane z useContextSelector lub useMemo?

Podsumowanie

Selektory wyodrębniają fragment stanu kontekstu i zapobiegają ponownemu renderowaniu przy zmianach niezwiązanych z tym fragmentem. Selektory należy definiować poza komponentami, aby zachować stabilne referencje. W zastosowaniach produkcyjnych należy używać use-context-selector lub Zustand, aby uzyskać profesjonalną obsługę selektorów.

Następny temat

Następna lekcja: **Kiedy nie używać Context** — dowie się Pani/Pan, jak rozpoznać sytuacje, w których przekazywanie propsów, kompozycja lub menedżer stanu będą lepszym rozwiązaniem niż Context.

Często zadawane pytania

Czy lekcja „Wzorzec selektora kontekstu” jest bezpłatna?

Tak — pełny tekst „Wzorzec selektora kontekstu” 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 „Wzorzec selektora kontekstu”?

Implementacja prostego hooka selektora, który powoduje ponowne renderowanie tylko wtedy, gdy zmieni się fragment kontekstu. Ć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 3 z 4.

Ile czasu zajmuje lekcja „Wzorzec selektora kontekstu”?

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. Dzielenie kontekstów w celu ograniczenia ponownych renderowań
  2. Zapamiętywanie wartości kontekstu za pomocą useMemo
  3. Wzorzec selektora kontekstu
  4. Kiedy nie używać kontekstu
← Powrót do React Academy