Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

122
Views
No se pueden ejecutar iteraciones únicas para objetos individuales

Estoy tratando de presentar 25 entradas ( name , company , skill , etc.) en la página y tengo problemas para obtener la información única.

es decir, solo veo la primera entrada una y otra vez. No estoy seguro de cómo reiterar nueva información, ya que solo será response.data.students[0] .

Así es como se ve mi código ahora, donde está el mapeo:

 export default function StudentList() { let [loaded, setLoaded] = useState(false); let [students, setStudent] = useState(" "); function doInfo(response) { console.log(response.data); setStudent(response.data.students); setLoaded(true); } if (loaded) { return ( <div className="StudentList"> <div className="row"> <div className="col"> {students.map(function (data, index) { return <StudentInfo data={data} key={index} />; })} </div> </div> </div> ); } else { let url = "https://api.hatchways.io/assessment/students"; axios.get(url).then(doInfo); } }

Aquí está la codificación para el componente StudentInfo como referencia:

 export default function StudentInfo() { const [info, addInfo] = useState(" "); function setInfo(response) { addInfo({ number: response.data.students[0].id, first: response.data.students[0].firstName, last: response.data.students[0].lastName, email: response.data.students[0].email, company: response.data.students[0].company, skill: response.data.students[0].skill, average: response.data.students[0].grades[0], }); } let url = "https://api.hatchways.io/assessment/students"; axios.get(url).then(setInfo); return ( <div className="StudentInfo"> <h1>{info.number}.</h1> <h2> Name: {info.first} {info.last} </h2> <h2>Email: {info.email}</h2> <h2>Company: {info.company}</h2> <h2>Skill: {info.skill}</h2> <h2>Average: {info.average}</h2> </div> ); }

¿Puede alguien ayudarme a codificarlo para que se ejecute en las 25 entradas, no solo en la primera?

about 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Prueba algo como esto:

  • establecer la matriz en el estado
  • useEffect(..., []) para activar la carga de datos (solo una vez).
  • establezca key={id} en la expansión de matriz asignada (o reaccione a las quejas por buenas razones que no se aplican en este caso particular).
 function StudentList() { const [students, setStudents] = useState(null); useEffect(() => { const url = "https://api.hatchways.io/assessment/students"; axios.get(url).then(({ data: { students } }) => setStudents(students)); }, []); if (!students) { return ( <div>loading...</div> ); } return ( <div className="StudentList"> <div className="row"> <div className="col"> { students.map(student => ( <StudentInfo key={student.id} info={student} /> )) } </div> </div> </div> ); }

y StudentInfo no necesita volver a cargar nada, solo formatea los datos que ya se obtuvieron

 export default function StudentInfo({ info }) { // edit: previous had { props: { info } } here, oops return ( <div className="StudentInfo"> <h1>{info.number}.</h1> <h2> Name: {info.first} {info.last} </h2> <h2>Email: {info.email}</h2> <h2>Company: {info.company}</h2> <h2>Skill: {info.skill}</h2> <h2>Average: {info.average}</h2> </div> ); }
about 4 years ago · Santiago Trujillo Report

0

Su componente secundario (StudentInfo) no está consumiendo los datos pasados por su componente principal. En lugar de volver a llamar a la API para obtener la información de los estudiantes, use la función prop.

 export default function StudentInfo({ data }) { const info = { number: data.id, first: data.firstName, last: data.lastName, email: data.email, company: data.company, skill: data.skill, average: data.grades[0] }; return ( <div className="StudentInfo"> <h1>{info.number}.</h1> <h2> Name: {info.first} {info.last} </h2> <h2>Email: {info.email}</h2> <h2>Company: {info.company}</h2> <h2>Skill: {info.skill}</h2> <h2>Average: {info.average}</h2> </div> ); }
about 4 years ago · Santiago Trujillo Report

0

Tema

Solo veo la primera entrada una y otra vez. No estoy seguro de cómo reiterar nueva información ya que solo será response.data.students[0]

Esto se debe a que el componente secundario StudentInfo vuelve a solicitar los datos de los estudiantes y solo accede al elemento 0 para cada estudiante asignado.

 export default function StudentInfo() { const [info, addInfo] = useState(" "); function setInfo(response) { addInfo({ number: response.data.students[0].id, // <-- (2) update state to first student! first: response.data.students[0].firstName, last: response.data.students[0].lastName, email: response.data.students[0].email, company: response.data.students[0].company, skill: response.data.students[0].skill, average: response.data.students[0].grades[0], }); } let url = "https://api.hatchways.io/assessment/students"; axios.get(url).then(setInfo); // <-- (1) fetch all students! return ( <div className="StudentInfo"> <h1>{info.number}.</h1> <h2> Name: {info.first} {info.last} </h2> <h2>Email: {info.email}</h2> <h2>Company: {info.company}</h2> <h2>Skill: {info.skill}</h2> <h2>Average: {info.average}</h2> </div> ); }

Solución

Solo necesita solicitar las evaluaciones de los estudiantes una vez en el componente principal y transmitir como apoyo los datos relevantes.

Ejemplo:

 function StudentList() { const [loaded, setLoaded] = useState(false); const [students, setStudent] = useState([]); useEffect(() => { const fetchData = async () => { try { const response = await axios.get(url); console.log(response.data); setStudent(response.data.students); } catch (error) { console.error(error); } finally { setLoaded(true); } }; fetchData(); }, []); return loaded ? ( <div className="StudentList"> <div className="row"> <div className="col"> {students.map(function (data) { return <StudentInfo data={data} key={data.id} />; })} </div> </div> </div> ) : ( "Fetching Student Assessments." ); }

...

 function StudentInfo({ data }) { const name = [data.firstName, data.lastName].join(" "); const average = ( data.grades.reduce((total, grade) => total + Number(grade), 0) / data.grades.length ).toFixed(2); return ( <div className="StudentInfo"> <h1>{data.id}.</h1> <h2>Name: {name}</h2> <h2>Email: {data.email}</h2> <h2>Company: {data.company}</h2> <h2>Skill: {data.skill}</h2> <h2>Average: {average}</h2> </div> ); }

Editar no se pueden ejecutar iteraciones únicas para objetos individuales

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!