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

143
Vistas
La solicitud de Axios sigue regresando dos veces sin definir y el doble de datos

Estoy tratando de obtener una API en un enlace personalizado de reactjs usando Axios. Sigo obteniendo el doble de respuesta como indefinido y luego el doble como una recuperación exitosa con los datos. El indefinido rompe mi aplicación.

Por cierto, estoy obteniendo de la API de usuario aleatorio.

 import axios from "axios"; import { useState, useEffect } from "react" export const useFetch = (url) => { const [loading, setLoading] = useState(false); const [data, setData] = useState([]); const [error, setError] = useState('') const getData = () => { setLoading(true) try { axios.get(url) .then(response => setData(response.data)); setLoading(false) } catch (error) { setError(error) } }; useEffect(() => { getData() }, [url]) return {loading, data, error} }

Tratando de usarlo aquí y mapearlo

 import React, { useEffect, useState } from 'react'; import { useParams } from 'react-router-dom'; import { useFetch } from '../custom_hooks/useFetch'; const PersonDetails = () => { const { loading, data , error } = useFetch('https://randomuser.me/api?results=20'); const { results } = data; const { id } = useParams(); const [person, setPerson] = useState({}) useEffect(() => { const newPerson = results?.find(person => person.login.uuid === parseInt(id)) setPerson(newPerson) console.log(newPerson) }, []) return ( <div> {person.name.first} </div> ) } export default PersonDetails

Esto es lo que realmente estoy tratando de hacer, pero ahora, debido a que no está definido, me sale que no puede leer las propiedades de undefined...

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

0

  1. debe definir la función getData dentro del efecto de uso o pasarla en la matriz de dependencia y envolver la función mediante devolución de llamada para evitar representaciones innecesarias.
  2. debe usar abortcontroller en caso de cancelaciones y tener la función de limpieza en efecto. (en este caso es mejor definir getdata body en useeffect)
 useEffect(() => { const controller = new AbortController(); const getData = async () => { setLoading(true) try { await axios.get(url, {signal: controller.signal}) .then(response => setData(response.data)); } catch (error) { setError(error) } } getData() return()=>controller.abort() },[url]}

puede leer más sobre cómo obtener datos con ganchos en la siguiente URL y dónde configurar la carga y otros estados necesarios. https://www.robinwieruch.de/react-hooks-fetch-data/

about 4 years ago · Juan Pablo Isaza Denunciar

0

Cuando el efecto te corre:

  1. setLoading(true)
  2. Enviar la solicitud de Ajax
  3. setLoading(false)

Más tarde, te llega la respuesta de Ajax:

  1. setData(response.data)

Dado que depende de la loading para determinar si data están configurados o no, se rompe.

Hay dos cosas que podrías hacer:

  1. Mueva setLoading(false) dentro de la devolución de llamada para que no se configure hasta then de haber setData(response.data)
  2. Deshágase de loading por completo y base su lógica en que los data no estén undefined o tengan un valor diferente.
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