React Context do przechowywania stanu motywu
Budować ThemeProvider udostępniający bieżący motyw i funkcję przełączania w całym drzewie komponentów
React Context do przechowywania stanu motywu 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.
Tworzenie ThemeContext
Należy rozpocząć od wywołania createContext() z wartością domyślną odpowiadającą strukturze kontekstu: const ThemeContext = createContext({ theme: 'light', toggleTheme: () => {} }). Wartość domyślna jest używana wyłącznie wtedy, gdy komponent odczytuje kontekst bez nadrzędnego komponentu Provider, co ułatwia testowanie izolowanych komponentów.
Komponent ThemeProvider
Komponent ThemeProvider opakowuje całą logikę motywu. Odczytuje preferencje systemowe podczas montowania, zarządza stanem theme, udostępnia funkcję toggleTheme i opakowuje elementy potomne w ThemeContext.Provider value={{ theme, toggleTheme }}. Należy umieścić go blisko początku drzewa komponentów.
Korzystanie z kontekstu za pomocą useContext
Dowolny komponent potomny może uzyskać dostęp do motywu, wywołując useContext(ThemeContext). Zwraca to bieżącą wartość kontekstu, obejmującą theme i toggleTheme. Komponent automatycznie renderuje się ponownie po zmianie motywu, dzięki czemu jest zawsze zsynchronizowany bez przekazywania właściwości przez wiele poziomów.
Synchronizowanie data-theme z DOM
Zmienne CSS zależą od atrybutu data-theme na elemencie głównym. W komponencie ThemeProvider należy dodać funkcję useEffect, która uruchamia się po każdej zmianie theme: document.documentElement.setAttribute('data-theme', theme). W ten sposób stan Reacta jest płynnie łączony z warstwą CSS.
Przechowywanie ustawienia użytkownika w localStorage
Aby zachować wybór użytkownika po przeładowaniu strony, należy zapisywać go w localStorage przy każdej zmianie motywu: localStorage.setItem('theme', theme). Można zamknąć tę logikę w niestandardowym hooku useLocalStorage, który zwraca parę podobną do stanu i automatycznie zapisuje każdą aktualizację.
Inicjalizowanie motywu z localStorage
Podczas inicjalizacji stanu motywu należy najpierw odczytać wartość z localStorage: localStorage.getItem('theme'). Jeśli nie ma zapisanej wartości, należy użyć preferencji systemowej za pośrednictwem window.matchMedia('(prefers-color-scheme: dark)').matches. Ta inicjalizacja jest wykonywana tylko raz podczas montowania.
Kolejność priorytetów motywu
Prawidłowa kolejność od najwyższego do najniższego priorytetu to: preferencja użytkownika zapisana w localStorage, następnie preferencja systemu operacyjnego, a na końcu zakodowana na stałe wartość domyślna, zwykle jasna. Taka kolejność zapewnia użytkownikowi ostateczną kontrolę, a jednocześnie uwzględnia konfigurację systemu, jeśli użytkownik nie dokonał jawnego wyboru w aplikacji.
Pomocniczy hook useTheme
Bezpośrednie wywoływanie useContext(ThemeContext) w każdym komponencie ujawnia szczegóły implementacji. Zamiast tego należy wyeksportować hook useTheme: function useTheme() { return useContext(ThemeContext); }. Komponenty mogą teraz importować useTheme i wywoływać go bez znajomości bazowego kontekstu.
Udostępnianie funkcji przełączania
Funkcja toggleTheme przełącza między wartościami light i dark: setTheme(prev => prev === 'light' ? 'dark' : 'light'). Należy udostępnić ją przez kontekst, aby dowolny przycisk w drzewie mógł ją wywołać. Stan jest przechowywany w jednym miejscu, a logika przełączania jest współdzielona w całej aplikacji.
Memoizowanie wartości kontekstu
Obiekt wartości kontekstu jest tworzony na nowo przy każdym renderowaniu komponentu ThemeProvider. Należy opakować go w useMemo, aby zapobiec niepotrzebnemu ponownemu renderowaniu wszystkich konsumentów kontekstu: const value = useMemo(() => ({ theme, toggleTheme }), [theme]). Jest to popularna optymalizacja wydajności dostawców kontekstu.
Testowanie ThemeProvider
W testach należy opakowywać renderowanie w niestandardową funkcję pomocniczą renderWithTheme, która używa ThemeProvider jako opakowania. Można również utworzyć prosty mock kontekstu na potrzeby izolowanych testów: ThemeContext.Provider value={{ theme: 'dark', toggleTheme: jest.fn() }}. Umożliwia to testowanie komponentów w określonym stanie motywu.
Kolejność priorytetów motywu
Jaka jest prawidłowa kolejność priorytetów podczas inicjalizowania motywu aplikacji, od najwyższego do najniższego priorytetu?
Podsumowanie lekcji: React Context dla stanu motywu
Należy utworzyć ThemeContext i komponent ThemeProvider, który zarządza stanem motywu, synchronizuje go z localStorage i ustawia data-theme w dokumencie. Do wygodnego korzystania z kontekstu należy używać pomocniczego hooka useTheme. Kolejność priorytetów to: zapisana preferencja, następnie preferencja systemowa, a na końcu wartość domyślna.
Często zadawane pytania
Czy lekcja „React Context do przechowywania stanu motywu” jest bezpłatna?
Tak — pełny tekst „React Context do przechowywania stanu motywu” 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 „React Context do przechowywania stanu motywu”?
Budować ThemeProvider udostępniający bieżący motyw i funkcję przełączania w całym drzewie 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 3 z 4.
Ile czasu zajmuje lekcja „React Context do przechowywania stanu motywu”?
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
- Wykrywanie schematu kolorów systemu
- Zmienne CSS do przełączania motywów
- React Context do przechowywania stanu motywu
- Zapisywanie motywu i zapobieganie migotaniu