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

195
Vistas
¿Por qué mi useEffect() no se dispara al actualizar un valor de contexto de reacción?

¿Por qué mi useEffect no se dispara al actualizar una dependencia que usa un contexto React? Estoy usando un contexto como parte de un asistente que recopilará una gran cantidad de datos de un usuario y luego los procesará en el último paso del asistente.

Los campos de Person se están actualizando y en la siguiente página del asistente puedo recuperarlos (no se muestra en mi ejemplo por brevedad). Sin embargo, quiero hacer una llamada API en useEffect para realizar algún procesamiento después de que el usuario haya ingresado su nombre y dirección.

Este es el código (es un poco artificial):

 export interface Person { name: string; address: string; skills: string[]; // collected on a different wizard page }; const PersonContext = React.createContext(null); const PersonProvider: React.FC = ({children}) => { const [personState, setPersonState] = useState<Person>({ name: "", address: "" }); return ( <PersonContext.Provider value={personState}> {children} </PersonContext.Provider> ); }; export const PersonPage: React.FC<{}> = () => { const personState = useContext(PersonContext); useEffect(() => { console.log("useEffect"); }, [personState]); /* Also tried, but no joy: useEffect(() => { console.log("useEffect"); }, [personState.name, personState.address]); */ const onNameChanged = (e) => { if(event.key === "Enter") { console.log(`name: ${e.target.value}`); personState.name = e.target.value; } }; const onAddressChanged = (e) => { if(event.key === "Enter") { console.log(`name: ${e.target.value}`); personState.address = e.target.value; } }; return ( <div> Name: <input name="name" onKeyDown={(e) => onNameChanged(e)} /> (press enter) <br /> You typed: <span>{personState.name}</span> <br/> <br/> Address: <input name="address" onKeyDown={(e) => onAddressChanged(e)} /> (press enter) <br /> You typed: <span>{personState.address}</span> </div> ); }; export const App: React.FC<{}> = () => { return ( <PersonProvider> <PersonPage /> </PersonProvider> ); }

También tengo un ejemplo de CodePen aquí:

https://codepen.io/kevstercode/pen/gOexPea

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Estás mutando el objeto. Debe usar la función setState para actualizarlo, por ejemplo.

en vez de

 const onAddressChanged = (e) => { if(event.key === "Enter") { personState.address = e.target.value; } };

hacer esto

 const onAddressChanged = (e) => { if(event.key === "Enter") { setPersonState(prevState => {...prevState, address: e.target.value)} } };
about 4 years ago · Juan Pablo Isaza Denunciar

0

const PersonProvider: React.FC = ({children}) => { // you should expose both the state object and its setter const personGetterSetter = useState<Person>({ name: "", address: "" }); return ( <PersonContext.Provider value={personGetterSetter}> {children} </PersonContext.Provider> ); };
 export const PersonPage: React.FC<{}> = () => { // unpack them here const [personState, setPersonState] = useContext(PersonContext); useEffect(() => { console.log("useEffect"); }, [personState]); const onNameChanged = (e) => { if(event.key === "Enter") { console.log(`name: ${e.target.value}`); // Wrong way to go // do not mutate state object directly // personState.name = e.target.value; // use the setter, this is the react way to update state setPersonState(personState => { return { ...personState, name: e.target.value } }) } }; ... };
about 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 Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda