Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

141
Visualizações
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 }) } }
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

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]);
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda