• Empleos
  • Sobre nosotros
  • Empleos
    • Inicio
    • Empleos
    • Cursos y retos
  • Empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Contrata talento tech
    • Blog
    • Comercial
    • Calculadora de salario

0

100
Vistas
No estoy seguro si estoy usando setState correctamente porque mi estado no se actualiza durante la carga inicial

Tengo un estado que almacena el tema de la aplicación actual, ya sea oscuro o claro. Utilizo el enlace useEffect para almacenar los cambios de estado en localStorage de modo que cuando el usuario actualice la página, se guarde su tema preferido y otro enlace useEffect para actualizar mi estado durante la carga inicial. Sin embargo, mi estado no se actualiza durante esa carga inicial.

Cosas que he probado:

  1. Asegúrese de que useEffect durante la carga inicial se coloque antes de useEffect para almacenar el estado del tema.
  2. Use Promise para asegurarse de que mi función changeTheme solo se active después de que el estado haya cambiado en la carga
  3. Registré mis resultados para saber que localStorage no tuvo ningún problema para guardar mis estados o hacer un seguimiento de los cambios, pero la función setState dentro de mi primer enlace useEffect fue la que no actualizó mi estado correctamente.

A continuación se muestran mis códigos:

 const [theme, setTheme] = useState({}); useEffect(() => { const loadedTheme = JSON.parse(localStorage.getItem(themeStorage)) if (loadedTheme) { console.log("Initial load") console.log(loadedTheme); console.log("Setting theme to localStorage") Promise.resolve() .then(() => { setTheme({ dark: loadedTheme.dark }) }) .then(() => { console.log(theme) }) .then(() => changeTheme()) } }, []) useEffect(() => { localStorage.setItem(themeStorage, JSON.stringify(theme)) console.log("Inside useEffect to save changed theme") console.log(theme) }, [theme]) function changeTheme() { console.log("Inside changeTheme function"); console.log(theme); if (!theme || !theme.dark) { //light turns to dark for (let vars of Object.keys(varTheme)) { document.documentElement.style.setProperty(`--${vars}`, varTheme[vars][0]); } setTheme({ ...theme, dark: true }) } else { for (let vars of Object.keys(varTheme)) { //dark turns to light document.documentElement.style.setProperty(`--${vars}`, varTheme[vars][1]); } setTheme({ ...theme, dark: false }) } }
almost 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

No está un poco claro cuál cree que es el problema, pero sospecho que está viendo/describiendo que el theme no se actualiza en el primer gancho useEffect .

Tema

La razón de esto es que el estado React se considera constante e inmutable. Dentro de la devolución de llamada useEffect , el valor del estado del theme se cierra en el alcance de la devolución de llamada y, sin importar la espera o el encadenamiento de promesas, cambiará el valor del estado cerrado en el alcance.

 const [theme, setTheme] = useState({}); // <-- initial state useEffect(() => { const loadedTheme = JSON.parse(localStorage.getItem(themeStorage)) if (loadedTheme) { console.log("Initial load") console.log(loadedTheme); console.log("Setting theme to localStorage") Promise.resolve() .then(() => { setTheme({ dark: loadedTheme.dark }) }) .then(() => { console.log(theme) }) // <-- still initial state .then(() => changeTheme()) } }, []); // <-- mounting "instance" of state

Luego invoque changeTheme que desde el gabinete y también accederá al estado "obsoleto" del gabinete.

Solución

LocalStorage es síncrono, por lo que puede configurar su estado inicial con una función de inicialización.

 const loadThemeFromStorage = () => { const { dark } = JSON.parse(localStorage.getItem(themeStorage)) ?? {}; return { dark }; }; const [theme, setTheme] = useState(loadThemeFromStorage());

Ahora, con el estado ya establecido inicialmente, puede llamar de forma segura a changeTheme en el gancho de montaje useEffect .

 useEffect(() => { console.log("Initial load"); console.log(theme); changeTheme(); }, []); useEffect(() => { localStorage.setItem(themeStorage, JSON.stringify(theme)); console.log("Inside useEffect to save changed theme"); console.log(theme); }, [theme]);
almost 4 years ago · Juan Pablo Isaza 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 Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda