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 PersonDetailsEsto 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...
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/
Cuando el efecto te corre:
setLoading(true)setLoading(false)Más tarde, te llega la respuesta de Ajax:
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:
setLoading(false) dentro de la devolución de llamada para que no se configure hasta then de haber setData(response.data)loading por completo y base su lógica en que los data no estén undefined o tengan un valor diferente.