【问题标题】:useFetch() custom hook not fetchinguseFetch() 自定义挂钩未获取
【发布时间】:2021-01-07 15:14:23
【问题描述】:

有人知道为什么这个useFetch 钩子没有获取任何东西吗? Chrome Devtools 说 beerId 没问题,它是传入的,它是由内部异步函数读取的,但根本没有发送 fetch。网络选项卡显示没有 API 调用。因此,输出的是一个空对象,不好。我错过了什么? API 很好,我的其他调用返回响应也很好。干杯。

export const useFetch = (beerId, initialValue) => {
    const [isLoading, setLoading] = useState(false);
    const [data, setData] = useState(initialValue); 
    useEffect(() => {
        async function fetchBeerById() {
            try {
                setLoading(true)
                const res = await fetch(`https://api.punkapi.com/v2/beers/${beerId}`);
                const beer = await res.json();
                setData(beer)
            } catch (err) {
                console.log(err)
            } finally {
                setLoading(false)
            }
        }
        fetchBeerById()
    },[beerId])
    return { data, isLoading}
}  

这是我在应用程序中使用它的方式:

const BeerDetails = () => {
  // get id from URL
  const params = useParams();
  const { beerId } = params;
  debugger
  // fetch that beer, apply local price
  const { data } = useFetch(beerId, {})
  const beer = usePriceBeer(data)
  
  // get the selected data from beer
  const selectBeerData = getSelectedBeerDetails(beer)
  const { name, image_url, abv, ibu, price, tagline, description } = 
  selectBeerData;
 
  return (...render jsx using above vars)
  
}

这是我在 DevTools 中看到的。出于某种原因,fetch 命令是无效的。如果我将鼠标悬停在res 上,则不会弹出任何内容,甚至不会触发 API 调用。事实上,整个useEffect 块只是被跳过了,甚至没有将isLoading 设置回false。

【问题讨论】:

  • 能否举例说明如何使用此功能?
  • ^^^ 是的,需要看看你是如何在你的应用程序中使用它的
  • 您发布的代码运行良好。正如其他人在上面提到的,您应该编辑您的问题并添加您使用此自定义挂钩的方式。
  • 谢谢各位,我已经编辑了这个问题以获得更多背景信息。 useEffect 钩子是罪魁祸首,但我不知道如何让这该死的东西开火......

标签: reactjs react-hooks fetch


【解决方案1】:

问题可能是初始加载时数据为空,并且您得到一个空对象。

我尝试为它创建一个原型,如果没有数据则返回 null。所以只有在使用 isLoading 退出时才返回数据。

https://codesandbox.io/s/recursing-banzai-b2y0c

确保检查第 26 行和第 40 行

【讨论】:

  • 嗨 Sodhi,这在沙盒中有效 - 但在应用程序中无效。这是一个谜。
  • 如果你愿意,我们一起来看看吧。
  • 你好 Sodhi,那太好了。你什么时候方便?我们可以连接 Skype 并共享屏幕......干杯
  • 任何物品都可以免费联系我,我们可以安排电话。
【解决方案2】:

您如何使用自定义挂钩?如果您以这种方式使用它,那么它应该可以按预期工作:

const App = () => {
  const { data, isLoading } = useFetch(10, {});

  if (isLoading) {
    return <h1>Loading...</h1>;
  }

  return <p>{JSON.stringify(data, null, 2)}</p>;
};

export default App;

顺便说一下,从您的 API 返回的响应是一个数组而不是一个对象,您可以根据需要将其更改为返回单个对象:

const [beer] = await res.json();
setData(beer);

【讨论】:

  • 嗨 Sirwan,我已经用更多上下文编辑了这个问题。欢呼
猜你喜欢
  • 1970-01-01
  • 2023-02-06
  • 2022-09-27
  • 1970-01-01
  • 2020-06-20
  • 2023-02-25
  • 2020-01-18
  • 2020-04-07
  • 2023-01-21
相关资源
最近更新 更多