React Context para el estado del tema
Crear un ThemeProvider que exponga el tema actual y una función de alternancia a todo el árbol de componentes
React Context para el estado del tema es una lección gratuita de React Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.
Creación de ThemeContext
Comience llamando a createContext() con un valor predeterminado que coincida con la estructura de su contexto: const ThemeContext = createContext({ theme: 'light', toggleTheme: () => {} }). El valor predeterminado solo se utiliza cuando un componente lee el contexto sin un Provider principal, lo que facilita probar componentes aislados.
El componente ThemeProvider
El componente ThemeProvider es un contenedor que reúne toda la lógica del tema. Lee la preferencia del sistema al montarse, administra el estado theme, proporciona una función toggleTheme y envuelve los elementos hijos en ThemeContext.Provider value={{ theme, toggleTheme }}. Colóquelo cerca de la parte superior del árbol de componentes.
Consumir el contexto con useContext
Cualquier componente descendiente puede acceder al tema llamando a useContext(ThemeContext). Esto devuelve el valor actual del contexto, incluidos theme y toggleTheme. El componente se vuelve a renderizar automáticamente cuando cambia el tema, por lo que siempre se mantiene sincronizado sin recurrir al prop drilling.
Sincronizar data-theme con el DOM
Las variables CSS dependen de un atributo data-theme en el elemento raíz. En ThemeProvider, añada un useEffect que se ejecute cada vez que cambie theme: document.documentElement.setAttribute('data-theme', theme). Esto conecta el estado de React con la capa CSS sin complicaciones.
Guardar la preferencia del usuario en localStorage
Para conservar la elección del usuario después de volver a cargar la página, escriba en localStorage cada vez que cambie el tema: localStorage.setItem('theme', theme). Puede encapsular esta lógica en un hook personalizado useLocalStorage que devuelva un par similar al estado y guarde automáticamente cada actualización.
Inicializar el tema desde localStorage
Al inicializar el estado del tema, lea primero de localStorage: localStorage.getItem('theme'). Si no existe ningún valor guardado, recurra a la preferencia del sistema mediante window.matchMedia('(prefers-color-scheme: dark)').matches. Esta inicialización solo se ejecuta una vez al montarse.
Orden de prioridad del tema
El orden de prioridad correcto, de mayor a menor, es: la preferencia del usuario almacenada en localStorage, después la preferencia del sistema operativo y, por último, un valor predeterminado codificado (normalmente light). Este orden garantiza que el usuario tenga siempre la decisión final y, al mismo tiempo, respeta la configuración de su sistema operativo si no ha elegido explícitamente una opción en la aplicación.
El hook de conveniencia useTheme
Llamar directamente a useContext(ThemeContext) en cada componente expone detalles de implementación. En su lugar, exporte un hook useTheme: function useTheme() { return useContext(ThemeContext); }. Ahora los componentes importan useTheme y lo llaman sin conocer el contexto subyacente.
Proporcionar una función de alternancia
La función toggleTheme alterna entre light y dark: setTheme(prev => prev === 'light' ? 'dark' : 'light'). Expóngala mediante el contexto para que cualquier botón del árbol pueda activarla. El estado vive en un único lugar y la lógica de alternancia se comparte en toda la aplicación.
Memorizar el valor del contexto
El objeto del valor del contexto se vuelve a crear en cada renderizado de ThemeProvider. Envuélvalo en useMemo para evitar renderizados innecesarios de todos los consumidores del contexto: const value = useMemo(() => ({ theme, toggleTheme }), [theme]). Esta es una optimización de rendimiento habitual para los proveedores de contexto.
Probar ThemeProvider
En las pruebas, envuelva los renderizados en una utilidad personalizada renderWithTheme que utilice ThemeProvider como contenedor. También puede crear un contexto simulado sencillo para realizar pruebas aisladas: ThemeContext.Provider value={{ theme: 'dark', toggleTheme: jest.fn() }}. Esto permite probar los componentes con un estado de tema específico.
Orden de prioridad del tema
¿Cuál es el orden de prioridad correcto para inicializar el tema de la aplicación, de mayor a menor prioridad?
Resumen de la lección: Contexto de React para el estado del tema
Cree un ThemeContext y un ThemeProvider que administre el estado del tema, lo sincronice con localStorage y establezca data-theme en el documento. Utilice un hook de conveniencia useTheme para consumirlo de forma clara. El orden de prioridad es: preferencia guardada, después preferencia del sistema y, por último, valor predeterminado.
Preguntas frecuentes
¿La lección «React Context para el estado del tema» es gratis?
Sí — el texto completo de «React Context para el estado del tema» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.
¿Qué aprenderé en «React Context para el estado del tema»?
Crear un ThemeProvider que exponga el tema actual y una función de alternancia a todo el árbol de componentes Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar React Academy?
No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «React Context para el estado del tema»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de React Academy?
Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Detectar el esquema de colores del sistema
- Variables CSS para cambiar de tema
- React Context para el estado del tema
- Conservar el tema y evitar el destello visual