如何使用 fetch 函数并在组件上显示 api 响应?自定义获取响应未传递给组件

How to use fetch function and show api response on component ? Custom fetch response is not passing to component

从 api 获取 /Vehicles 后,我想在组件中显示它们,但在 useFetch 函数中我可以 console.log res.data 但在 Trucks 组件中我无法映射卡车。

我的自定义 useFetch 函数:

import { useState, useEffect } from 'react';
import axios from 'axios';

const useFetch = (url) => {
  const api = axios.create({
    baseURL: 'api url',
    headers: { Authorization: `Bearer ${localStorage.token}` },
  });

  const [data, setData] = useState(null);

  const [isPending, setIsPending] = useState(true);

  const [error, setError] = useState(null);

  useEffect(() => {
    const abortCont = new AbortController();

    setTimeout(() => {

      api
        .get(url)
        .then((res) => {
          console.log(res.data);
          if (!res.ok) {
            throw Error('Could not with fetch data');
          }
        })
        .then((data) => {
          data.json();
          console.log(data);
          setIsPending(false);
          setError(null);
        })
        .catch((err) => {
          if (err.name === 'AbortError') {
            console.log('fetch aborted');
          } else {
            setIsPending(false);
            setError(err.message);
          }
        });
    }, 1000);

    return () => abortCont.abort();
  }, [url]); 
  return { data, isPending, error };
};

export default useFetch;

我使用了这个自定义的 useFetch 函数并且可以获取数据(在函数内部),但它无法用于呈现 我认为的一些可能的原因;

卡车组件:

const Trucks = () => {
  const { data: trucks, error, isPending } = useFetch('/vehicles');// 
  console.log('they are ' + { trucks }); //console output ->[object,Object]

  return (Some Jsx)};

export default Trucks; 

谢谢

我看到你的 Hook 本身有两个问题。

第一件事是你从不打电话给setData。这意味着尽管您在钩子中获取数据并将其导出,但您从未设置 data 对象来保存检索到的数据。

第二件事是,第二个 then 实际上并未对您检索的数据执行任何操作。您可以在第一条语句中处理这一切

.then((res) => {
    setData(res.data);
    setIsPending(false);
    if (!res.ok) {
        setIsPending(false);
        throw Error("Could not with fetch data");
    }
})

完成此操作后,您应该能够在相关组件中调用挂钩,并使用一些 JSX 渲染它。只需确保在实际呈现数据之前添加对 isPending 的检查并显示某种加载屏幕。

另外注意,当你使用axios时,你不需要调用data.json()。这是 fetch API 所必需的,但 axios 只需要您在解析 promise

时调用 res.data