React Context per lo stato del tema
Creare un ThemeProvider che esponga il tema corrente e una funzione di alternanza all'intero albero dei componenti
React Context per lo stato del tema è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.
Creazione di ThemeContext
Iniziate chiamando createContext() con un valore predefinito che corrisponda alla forma del contesto: const ThemeContext = createContext({ theme: 'light', toggleTheme: () => {} }). Il valore predefinito viene usato solo quando un componente legge il contesto senza un Provider padre, facilitando il testing di componenti isolati.
Il componente ThemeProvider
Il componente ThemeProvider è un wrapper che centralizza tutta la logica del tema. Legge la preferenza di sistema al montaggio, gestisce lo stato theme, fornisce una funzione toggleTheme e racchiude i figli in ThemeContext.Provider value={{ theme, toggleTheme }}. Posizionatelo vicino alla parte superiore dell'albero dei componenti.
Utilizzare il contesto con useContext
Qualsiasi componente discendente può accedere al tema chiamando useContext(ThemeContext). Questo restituisce il valore corrente del contesto, inclusi theme e toggleTheme. Il componente esegue automaticamente un nuovo rendering quando il tema cambia, rimanendo sempre sincronizzato senza dover passare le prop lungo tutta la gerarchia.
Sincronizzare data-theme con il DOM
Le variabili CSS dipendono da un attributo data-theme sull'elemento radice. In ThemeProvider, aggiungete un useEffect che venga eseguito ogni volta che theme cambia: document.documentElement.setAttribute('data-theme', theme). In questo modo lo stato React e il livello CSS comunicano senza soluzione di continuità.
Memorizzare la scelta dell'utente in localStorage
Per mantenere la scelta dell'utente dopo i ricaricamenti della pagina, scrivete in localStorage ogni volta che il tema cambia: localStorage.setItem('theme', theme). Potete incapsulare questa logica in un hook personalizzato useLocalStorage che restituisca una coppia simile a uno stato e memorizzi automaticamente ogni aggiornamento.
Inizializzare il tema da localStorage
Quando inizializzate lo stato del tema, leggete prima da localStorage: localStorage.getItem('theme'). Se non esiste alcun valore memorizzato, utilizzate come alternativa la preferenza di sistema tramite window.matchMedia('(prefers-color-scheme: dark)').matches. Questa inizializzazione viene eseguita una sola volta al montaggio.
Ordine di priorità del tema
L'ordine corretto, dalla priorità più alta a quella più bassa, è: la preferenza dell'utente memorizzata in localStorage, quindi la preferenza del sistema operativo e infine un valore predefinito codificato direttamente, in genere light. Quest'ordine garantisce che l'utente abbia sempre l'ultima parola, rispettando comunque la configurazione del sistema operativo se non ha effettuato una scelta esplicita nell'app.
L'hook useTheme di utilità
Chiamare direttamente useContext(ThemeContext) in ogni componente espone dettagli implementativi. Esportate invece un hook useTheme: function useTheme() { return useContext(ThemeContext); }. I componenti possono così importare useTheme e chiamarlo senza conoscere il contesto sottostante.
Fornire una funzione toggle
La funzione toggleTheme alterna tra light e dark: setTheme(prev => prev === 'light' ? 'dark' : 'light'). Esponetela tramite il contesto, così qualsiasi pulsante nell'albero dei componenti può attivarla. Lo stato viene gestito in un unico punto e la logica di commutazione è condivisa ovunque.
Memorizzare il valore del contesto
L'oggetto che rappresenta il valore del contesto viene ricreato a ogni rendering di ThemeProvider. Racchiudetelo in useMemo per evitare rendering non necessari di tutti i consumer del contesto: const value = useMemo(() => ({ theme, toggleTheme }), [theme]). Questa è una comune ottimizzazione delle prestazioni per i Provider di contesto.
Testare ThemeProvider
Nei test, racchiudete i rendering in un'utilità personalizzata renderWithTheme che utilizzi ThemeProvider come wrapper. Potete anche creare un mock semplice del contesto per i test isolati: ThemeContext.Provider value={{ theme: 'dark', toggleTheme: jest.fn() }}. In questo modo potete testare i componenti in uno stato del tema specifico.
Ordine di priorità del tema
Qual è l'ordine di priorità corretto per inizializzare il tema dell'app, dalla priorità più alta a quella più bassa?
Riepilogo della lezione: React Context per lo stato del tema
Create un ThemeContext e un ThemeProvider che gestisca lo stato del tema, lo sincronizzi con localStorage e imposti data-theme nel document. Utilizzate un hook useTheme di utilità per un accesso più pulito. L'ordine di priorità è: preferenza memorizzata, quindi preferenza di sistema e infine valore predefinito.
Domande Frequenti
La lezione «React Context per lo stato del tema» è gratuita?
Sì — il testo completo di «React Context per lo stato del tema» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.
Cosa imparerò in «React Context per lo stato del tema»?
Creare un ThemeProvider che esponga il tema corrente e una funzione di alternanza all'intero albero dei componenti Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare React Academy?
Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «React Context per lo stato del tema»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione React Academy?
Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Rilevare lo schema colori del sistema
- Variabili CSS per cambiare tema
- React Context per lo stato del tema
- Persistenza del tema e prevenzione del flash