【发布时间】:2022-10-09 14:57:45
【问题描述】:
我正在尝试使用 Axios 在自定义 reactjs 挂钩上获取 api。我一直得到两倍的未定义响应,然后是成功获取数据的两倍。未定义破坏了我的应用程序。
顺便说一句,我正在从 randomuser api 获取。
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}
}
尝试在这里使用它并映射它
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
这是我实际上正在尝试做的事情,但现在因为它是未定义的,我知道无法读取未定义的属性......
【问题讨论】:
-
嗨 Liss,欢迎来到 Stack Overflow!你能提供一个MRE吗?
-
使用
loadingexport 来规避它(并在获取请求成功后将其设置为false)。 -
不要将 await 与 .then 一起使用。钩子也不会等待异步函数在返回之前返回设置状态。
-
@madflow 我对重复调用更感兴趣。我认为
loading或未定义的问题是次要的。仍然是防止未定义的好方法,但我认为这不是根本问题 -
data状态变量将在首次加载时未定义。您可以尝试将其设置为一个空数组作为初始值,例如const [data, setData] = useState([]);,它可能会阻止它破坏您的应用程序,但如果没有更多详细信息,则很难进行故障排除。
标签: javascript reactjs axios fetch