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

108
Vistas
Reaccionar contexto - estado no verdadero

Estoy haciendo un proyecto y me quedé atascado en el archivo de contexto. Quiero que mi planet estatal sea verdadero para poder usarlo en mi archivo de componentes. Al principio se vuelve verdadero mostrando el índice derecho de la matriz, pero al final se vuelve indefinido. ¿Alguien puede señalarme qué está causando que el estado del "planeta" no esté definido al final? Estoy hablando de la declaración if - if (planet) {...} . Estoy adjuntando el código del archivo de contexto y la pantalla de la consola de mi navegador. Sería bueno si alguien también me dijera si puedo cambiar el estado en su propia función de configuración, por ejemplo, setPlanets(planet[0]) .

 import React from "react"; import { useState, useEffect } from "react"; export const Context = React.createContext({ onChooseMoon: () => {}, onChooseMars: () => {}, }); const ContextProvider = (props) => { const [planet, setPlanets] = useState(); useEffect(() => { fetch("./data.json") .then((response) => { return response.json(); }) .then((data) => { const transformedData = data.destinations.map((destination) => { return { name: destination.name, img: destination.images.png, desc: destination.description, dist: destination.distance, travel: destination.travel, }; }); setPlanets(transformedData); }); }, []); if (planet) { setPlanets(planet[0]); console.log(planet[0]); console.log("hello"); } const setMoonHandler = () => { setPlanets(planet[0]); }; const setMarsHandler = () => { setPlanets(planet[1]); }; return ( <Context.Provider value={{ planet: planet, onChooseMoon: setMoonHandler, onChooseMars: setMarsHandler, }} > {props.children} </Context.Provider> ); }; export default ContextProvider;

ingrese la descripción de la imagen aquí

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

0

Aquí hay un desglose de lo que está pasando:

  1. El componente se monta, el valor del planet no está undefined , se activa useEffect . Cuando useEffect ejecuta setPlanets(transformedData) , se activa la repetición.
  2. El valor del planet ahora es lo que haya sido transformedData (supongo que una matriz de objetos del planeta). Dado planet es verdadero, setPlanets(planet[0]) se ejecuta, provocando una nueva representación.
  3. El valor del planet es ahora lo que transformedData[0] (un solo planeta). Dado planet sigue siendo verdadero, setPlanets(planet[0]) se ejecuta de nuevo, provocando una nueva representación.
  4. El valor del planet ahora es lo que sea transformedData[0][0] . Dado que transformedData[0] no era una matriz y probablemente no tenga la clave 0 , el valor de planet ahora no está undefined nuevamente.

El problema es que si alguna vez se define un planet , la ejecución de setPlanet(planet[0]) se ejecutará hasta que el valor del planet vuelva a estar undefined .

Creo que lo que pretendías hacer (a juzgar por el nombre) era tener dos variables de estado separadas. Uno para contener todos los planetas y otro para contener un solo planeta (activo/enfocado).

Aquí hay un ejemplo:

 const ContextProvider = (props) => { const [activePlanet, setActivePlanet] = useState(); const [planets, setPlanets] = useState([]); useEffect(() => { fetch("./data.json") // same as before }, []); useEffect(() => { if (!activePlanet && planets.length > 0) { setActivePlanet(planets[0]); console.log(planets[0]); console.log("hello"); } }, [activePlanet, planets]); // ... };

Además, generalmente es una buena idea envolver toda la lógica de actualización de estado en enlaces (o vinculados a eventos como clics), por lo que agregué un useEffect para envolver la llamada setActivePlanet .

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