React Academy · Lektion

React Context til tematilstand

Opbyg en ThemeProvider, der eksponerer det aktuelle tema og en toggle-funktion for hele komponenttræet.

Lektion 3 af 413 trin

React Context til tematilstand er en gratis React Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i React Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. React Academy-kurset indeholder 4 lektioner i alt.

Oprettelse af ThemeContext

Start med at kalde createContext() med en standardværdi, der passer til formen på din kontekst: const ThemeContext = createContext({ theme: 'light', toggleTheme: () => {} }). Standardværdien bruges kun, når en komponent læser konteksten uden en overordnet Provider, hvilket er nyttigt, når isolerede komponenter testes.

Komponenten ThemeProvider

Komponenten ThemeProvider er en indpakning, der indeholder al logikken til temaet. Den læser systempræferencen ved montering, administrerer tilstanden theme, stiller funktionen toggleTheme til rådighed og omslutter children i ThemeContext.Provider value={{ theme, toggleTheme }}. Placér den tæt på toppen af dit komponenttræ.

Brug af kontekst med useContext

Alle underordnede komponenter kan få adgang til temaet ved at kalde useContext(ThemeContext). Det returnerer den aktuelle kontekstværdi, herunder theme og toggleTheme. Komponenten gengives automatisk igen, når temaet ændres, så den altid er synkroniseret uden at sende props gennem flere komponentlag.

Synkronisering af data-theme med DOM'en

CSS-variabler afhænger af attributten data-theme på rodelementet. Tilføj i ThemeProvider en useEffect, der kører, hver gang theme ændres: document.documentElement.setAttribute('data-theme', theme). Det forbinder React-tilstanden og CSS-laget problemfrit.

Lagring af brugerens tilsidesættelse i localStorage

Hvis brugerens valg skal bevares ved genindlæsning af siden, skal du skrive til localStorage, hver gang temaet ændres: localStorage.setItem('theme', theme). Du kan indkapsle denne logik i en brugerdefineret useLocalStorage-hook, der returnerer et par, som fungerer som en tilstand, og automatisk gemmer hver opdatering.

Initialisering af tema fra localStorage

Læs først fra localStorage, når tematilstanden initialiseres: localStorage.getItem('theme'). Hvis der ikke findes en gemt værdi, skal du bruge systempræferencen som alternativ via window.matchMedia('(prefers-color-scheme: dark)').matches. Denne initialisering kører kun én gang ved montering.

Prioritetsrækkefølge for temaet

Den korrekte prioritet fra højeste til laveste er: brugerens gemte præference i localStorage, derefter operativsystemets præference og til sidst en fast standardværdi, normalt lys. Denne rækkefølge sikrer, at brugeren altid har den endelige kontrol, samtidig med at operativsystemets indstilling respekteres, hvis brugeren ikke udtrykkeligt har valgt et tema i appen.

Hjælpehooket useTheme

Hvis du kalder useContext(ThemeContext) direkte i hver komponent, afslører du implementeringsdetaljer. Eksportér i stedet et useTheme-hook: function useTheme() { return useContext(ThemeContext); }. Komponenterne importerer nu useTheme og kalder det uden at kende noget til den underliggende kontekst.

Levering af en skiftefunktion

Funktionen toggleTheme skifter mellem light og dark: setTheme(prev => prev === 'light' ? 'dark' : 'light'). Eksponér den gennem konteksten, så enhver knap hvor som helst i træet kan udløse den. Tilstanden findes ét sted, og skiftelogikken deles overalt.

Memoisering af kontekstværdien

Kontekstværdiobjektet oprettes igen ved hver gengivelse af ThemeProvider. Omslut det i useMemo for at forhindre unødvendige gengivelser af alle komponenter, der bruger konteksten: const value = useMemo(() => ({ theme, toggleTheme }), [theme]). Det er en almindelig ydelsesoptimering for kontekstprovidere.

Test af ThemeProvider

Ved test skal du omslutte gengivelser med et brugerdefineret renderWithTheme-værktøj, der bruger ThemeProvider som indpakning. Du kan også oprette en enkel simuleret kontekst til isolerede test: ThemeContext.Provider value={{ theme: 'dark', toggleTheme: jest.fn() }}. Det gør det muligt at teste komponenter i en bestemt tematilstand.

Prioritetsrækkefølge for temaet

Hvad er den korrekte prioritetsrækkefølge ved initialisering af appens tema, fra højeste til laveste prioritet?

Opsummering af lektionen: React Context til tematilstand

Opret en ThemeContext og en ThemeProvider, der administrerer tematilstanden, synkroniserer med localStorage og angiver data-theme på dokumentet. Brug et useTheme-hook for at få en enkel adgang til konteksten. Prioritetsrækkefølgen er: gemt præference, derefter systempræference og til sidst standardværdi.

Gratis at komme i gang

Lær React med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
88
Lektioner
324

Ofte stillede spørgsmål

Er lektionen “React Context til tematilstand” gratis?

Ja — hele teksten til “React Context til tematilstand” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af React Academy-kurset, skal du opgradere til CoddyKit PRO. React Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “React Context til tematilstand”?

Opbyg en ThemeProvider, der eksponerer det aktuelle tema og en toggle-funktion for hele komponenttræet. Du øver dig i React Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på React Academy?

Der kræves ingen tidligere erfaring. React Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “React Context til tematilstand”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne React Academy-lektion?

Ja. Alle React Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Registrering af systemets farveskema
  2. CSS-variabler til skift af tema
  3. React Context til tematilstand
  4. Bevaring af tema og forebyggelse af flash
← Tilbage til React Academy