React Context för temats tillstånd
Bygg en ThemeProvider som exponerar aktuellt tema och en växlingsfunktion för hela komponentträdet.
React Context för temats tillstånd är en gratis lektion i React Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för React Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i React Academy innehåller totalt 4 lektioner.
Skapa ThemeContext
Börja med att anropa createContext() med ett standardvärde som överensstämmer med kontextens struktur: const ThemeContext = createContext({ theme: 'light', toggleTheme: () => {} }). Standardvärdet används endast när en komponent läser kontexten utan en överordnad Provider, vilket underlättar testning av isolerade komponenter.
ThemeProvider-komponenten
Komponenten ThemeProvider är en omslutande komponent som innehåller all temalogik. Den läser systemets inställning vid montering, hanterar tillståndet theme, tillhandahåller funktionen toggleTheme och omsluter underordnade komponenter i ThemeContext.Provider value={{ theme, toggleTheme }}. Placera den nära toppen av komponentträdet.
Använda kontext med useContext
Alla underordnade komponenter kan komma åt temat genom att anropa useContext(ThemeContext). Detta returnerar det aktuella kontextvärdet, inklusive theme och toggleTheme. Komponenten renderas automatiskt om när temat ändras, så att det alltid hålls synkroniserat utan prop drilling.
Synkronisera data-theme med DOM
CSS-variabler är beroende av attributet data-theme på rotelementet. Lägg till en useEffect i ThemeProvider som körs varje gång theme ändras: document.documentElement.setAttribute('data-theme', theme). Detta skapar en sömlös koppling mellan React-tillståndet och CSS-lagret.
Lagra användarens åsidosättning i localStorage
För att spara användarens val mellan omladdningar av sidan skriver ni till localStorage varje gång temat ändras: localStorage.setItem('theme', theme). Denna logik kan kapslas in i en anpassad hook, useLocalStorage, som returnerar ett tillståndsliknande par och automatiskt sparar varje uppdatering.
Initiera temat från localStorage
När temats tillstånd initieras läser ni först från localStorage: localStorage.getItem('theme'). Om inget sparat värde finns använder ni systemets inställning som reserv via window.matchMedia('(prefers-color-scheme: dark)').matches. Denna initiering körs endast en gång vid montering.
Temats prioriteringsordning
Den korrekta prioriteringen från högst till lägst är: sparad användarinställning i localStorage, därefter operativsystemets inställning och slutligen ett hårdkodat standardvärde, vanligtvis light. Denna ordning säkerställer att användaren alltid har sista ordet, samtidigt som operativsystemets konfiguration respekteras om inget uttryckligt val har gjorts i appen.
Den praktiska useTheme-hooken
Att direkt anropa useContext(ThemeContext) i varje komponent exponerar implementeringsdetaljer. Exportera i stället en useTheme-hook: function useTheme() { return useContext(ThemeContext); }. Komponenterna importerar nu useTheme och anropar den utan att känna till den underliggande kontexten.
Tillhandahålla en växlingsfunktion
Funktionen toggleTheme växlar mellan light och dark: setTheme(prev => prev === 'light' ? 'dark' : 'light'). Exponera den via kontexten så att vilken knapp som helst i komponentträdet kan utlösa den. Tillståndet finns på ett ställe, medan växlingslogiken delas överallt.
Memoisera kontextvärdet
Kontextvärdesobjektet skapas på nytt vid varje rendering av ThemeProvider. Lägg det i useMemo för att förhindra onödiga omrenderingar av alla kontextkonsumenter: const value = useMemo(() => ({ theme, toggleTheme }), [theme]). Detta är en vanlig prestandaoptimering för kontextproviders.
Testa ThemeProvider
I tester kan ni omsluta renderingar i ett anpassat verktyg, renderWithTheme, som använder ThemeProvider som wrapper. Ni kan också skapa en enkel mockad kontext för isolerade tester: ThemeContext.Provider value={{ theme: 'dark', toggleTheme: jest.fn() }}. På så sätt kan komponenter testas i ett specifikt temaläge.
Temats prioriteringsordning
Vilken är den korrekta prioriteringsordningen för att initiera appens tema, från högst till lägst prioritet?
Sammanfattning av lektionen: React Context för temats tillstånd
Skapa en ThemeContext och en ThemeProvider som hanterar temats tillstånd, synkroniserar med localStorage och anger data-theme i dokumentet. Använd en praktisk useTheme-hook för ren och enkel användning. Prioriteringsordningen är: sparad inställning, därefter systemets inställning och slutligen standardvärdet.
Lär dig React med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 88
- Lektioner
- 324
Vanliga frågor
Är lektionen ”React Context för temats tillstånd” gratis?
Ja – hela texten till ”React Context för temats tillstånd” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i React Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i React Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”React Context för temats tillstånd”?
Bygg en ThemeProvider som exponerar aktuellt tema och en växlingsfunktion för hela komponentträdet. Ni övar på React Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig React Academy?
Du behöver inga förkunskaper. Utbildningen i React Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”React Context för temats tillstånd”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här React Academy-lektionen?
Ja. Varje React Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Identifiera systemets färgschema
- CSS-variabler för temaväxling
- React Context för temats tillstånd
- Spara tema och förhindra bildflimmer