Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

146
Vistas
¿Cómo puedo hacer que el tema del sitio web persista al actualizar en React?

Actualmente estoy trabajando en un sitio web de pronóstico del tiempo y estoy tratando de aplicar un conmutador de tema. Ya configuré la funcionalidad, pero el tema elegido no persiste cuando se actualiza la página. ¿Alguien podría señalar lo que me estoy perdiendo? El archivo console.log muestra que el tema dentro de localStorage cambia cuando hago clic en el conmutador de tema.

 import { WeatherApi } from "./pages/home/weather-api"; import '../src/App.scss' import { createContext, useEffect, useState } from "react"; import ReactSwitch from "react-switch"; export const ThemeContext = createContext({}) function App() { const [theme, setTheme] = useState<string>(localStorage.getItem('theme') || 'light') useEffect(() => { const localTheme = localStorage.getItem(theme) console.log(localTheme) if (!localTheme) { setTheme("light") } if (localTheme) { if (localTheme === 'light') { setTheme('light') localStorage.setItem('theme', theme) console.log(localStorage) } if (localTheme === 'dark') { setTheme('dark') localStorage.setItem('theme', theme) console.log(localStorage) } } },[theme]) const toggleTheme = () => { setTheme((currentTheme: any) => (currentTheme === "light" ? "dark" : "light")) } return ( <ThemeContext.Provider value={{ theme, toggleTheme }}> <div className="App" id={theme}> <WeatherApi /> <div className="switch"> <label>{theme === "light" ? "Light mode" : "Dark mode"}</label> <ReactSwitch onChange={toggleTheme} checked={theme === "dark"} /> </div> </div> </ThemeContext.Provider> ) } export default App;
about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Debe cargar el tema desde localStorage y usarlo como estado inicial, algo como esto:

 ///... more js code const intialState = localStorage.getItem('theme') || 'light'); const [theme, setTheme] = useState<string>('') const toggleTheme = () => { const newTheme = theme === "light" ? "dark" : "light"; localStorage.setItem('theme', newTheme); setTheme(newTheme); } ///... more js code

Nota: no necesita usar JSON.stringify o JSON.parse en cadenas

about 4 years ago · Santiago Trujillo Denunciar

0

Ya carga el tema desde localStorage como el valor predeterminado del estado. La otra carga de localStorage en useEffect probablemente esté descartando/anulando los cambios del usuario.

Intenta eliminarlo. Por ejemplo:

 useEffect(() => { localStorage.setItem('theme', theme); }, [theme]);
about 4 years ago · Santiago Trujillo Denunciar

0

Tienes un bucle infinito de gancho de efecto clásico aquí. El gancho de efecto depende del theme . Si llama a setTheme dentro del enlace, se volverá a ejecutar hasta el infinito.

Recomendaría crear un componente de proveedor de contexto de tema como este. Como está utilizando Typescript, debe evitar any y escribir correctamente todos sus valores.

 import { createContext, useState, useEffect, FC } from "react"; type Theme = "light" | "dark"; interface ThemeContextValue { theme: Theme; toggleTheme: () => void; } export const ThemeContext = createContext<ThemeContextValue>({ theme: "light", toggleTheme: () => {}, }); export const ThemeContextProvider: FC = ({ children }) => { // initialise state from localStorage const [theme, setTheme] = useState<Theme>( (localStorage.getItem("theme") ?? "light") as Theme ); // update localStorage when the theme changes useEffect(() => { localStorage.setItem("theme", theme); }, [theme]); const toggleTheme = () => { setTheme((current) => (current === "light" ? "dark" : "light")); }; return ( <ThemeContext.Provider value={{ theme, toggleTheme }}> {children} </ThemeContext.Provider> ); };
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda