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

153
Visualizações
useState no actualiza todos los componentes de mi aplicación

hola Trabajando con reaccionar y me encontré con un problema desconcertante.

 import { useState } from "react"; function useTheme() { const [themeName, setThemeName] = useState("dark"); return [themeName, setThemeName]; } function Other() { const [themeName, setThemeName] = useTheme(); return <div>{themeName}</div>; } function ThemeSwitcher() { const [themeName, setThemeName] = useTheme(); return ( <> <button onClick={() => { themeName == "dark" ? setThemeName("light") : setThemeName("dark"); }} > {"BUTTON"} </button> {themeName} </> ); } function App() { const [themeName, setPalette] = useTheme(); return ( <div> <ThemeSwitcher /> <Other /> <div>{themeName}</div> </div> ); } export default App;

Esta es una versión extremadamente básica de mi problema, eliminé todo lo que se me ocurrió y aún persiste. Tengo una aplicación con un enlace llamado useTheme, que proporciona una función que cambia el nombre de una variable de estado "themeName".

Tengo un componente de botón ThemeSwitcher que, al hacer clic, cambia el nombre del tema entre "oscuro" y "claro".

Al hacer clic en el botón, la variable de estado themeName se actualiza (que estoy seguro, ya que el fragmento {themeName} dentro de ThemeSwitcher se actualiza correctamente). Sin embargo, {themeName} dentro de la aplicación y {themeName} dentro de Other en realidad no se actualizan. No veo la diferencia aquí, y actualmente estoy desconcertado en cuanto a por qué uno se actualizaría y los otros no.

Estado inicial

Estado después de un clic.

¿Alguna idea de por qué el componente de la aplicación no se vuelve a representar a pesar de que cambia la variable de estado?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Son estados completamente separados. Este:

 function useTheme() { const [themeName, setThemeName] = useState("dark"); return [themeName, setThemeName]; }

efectivamente no es diferente de usar useState en sí mismo. Entonces su problema es similar a preguntar por qué, aquí:

 function Other() { const [themeName, setThemeName] = useState(); return <div>{themeName}</div>; } function ThemeSwitcher() { const [themeName, setThemeName] = useState(); // ...

los dos themeNames de tema no están sincronizados, es porque no tienen conexión entre sí.

Para solucionar esto, generalmente hay 2 enfoques que se pueden usar:

  • Declare el estado del tema en un componente, el componente superior de modo que todos los descendientes lo usen. Aquí, esa es la aplicación. Luego transmita el estado y el setter estatal a todos los niños, y pídales que usen el accesorio según sea necesario. Por lo general, este es un buen enfoque cuando el estado y el establecidor de estado no se usan en muchos lugares.
 function App() { const [themeName, setThemeName] = useTheme(); return ( <div> <ThemeSwitcher {...{ themeName, setThemeName }} /> <Other {...{ themeName, setThemeName }} /> <div>{themeName}</div> </div> ); }
  • O bien, utilice la API de contexto en su lugar . Requiere más configuración, pero es un buen enfoque cuando desea crear algo en un padre y permitir que cada descendiente lo consuma, sin importar dónde se encuentre en el árbol de componentes, sin pasar manualmente los valores como accesorios en todas partes.
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