如何使用反应钩子重新获取 API

Posted

技术标签:

【中文标题】如何使用反应钩子重新获取 API【英文标题】:How can I re-fetch an API using react hooks 【发布时间】:2020-06-18 22:45:16 【问题描述】:

开发者,

我决定最终通过我认为是一个简单的项目来学习 React Hooks。我不太清楚。这是我到目前为止的代码。

import React,  useState, useEffect  from "react"
import useFetch from "./utils/getKanya"

const kanye = "https://api.kanye.rest"

const Index = () => 
  let [kanyaQuote, setKanyeQuote] = useState(null)
  let data = useFetch(kanye)

  const getMore = () => 
    setKanyeQuote(useFetch(kanye))
  

  return (
    <>
      <h1>Welcome to Next.js!</h1>
      <p>Here is a random Kanye West quote:</p>
      !data ? <div>Loading...</div> : <p>!kanyaQuote ? data : kanyaQuote</p>
      <button onClick=getMore>Get new quote</button>
    </>
  )


export default Index
    我将 kanyeQuote 状态值设为null 我获取初始数据 我要么显示“正在加载...”,要么显示初始报价 我正在尝试设置一个按钮来重新获取 API 并通过 getKanyeQuote (setState) 将数据存储在 kanyeQuote 中

这是我收到的错误Error: Invalid hook call...

如果您能就此提供任何指导,我将不胜感激。

【问题讨论】:

所以错误是can't call hooks in callback? 请添加getKanya文件 github.com/WebRuin/Kanye-/blob/master/pages/utils/getKanya.js 【参考方案1】:

这里的问题是,您只能在组件的根目录中直接使用钩子。 这是第一条“钩子规则”。你可以阅读更多关于here

  const getMore = () => 
    setKanyeQuote(useFetch(kanye) /* This cannot work! */)
  

有几种方法可以解决这个问题。在不知道您的 useFetch-hook 的内部逻辑的情况下,我只能假设您能够更改它。

更改挂钩以在内部处理其状态

解决此问题的一种方法是更改​​自定义 useFetch 挂钩的逻辑,以提供某种形式的函数来获取数据并在内部更新状态。然后它可能看起来像这样:

const  data, doFetch  = useFetch(kanye);
useEffect(() => 
  doFetch(); // initialFetch
, []);

const getMore = () => 
  doFetch();
;

// ...

然后您需要更改 useFetch-hook 的内部逻辑以在内部使用 useState 并公开它的 getter。它看起来像这样:

export const useFetch = (url) => 
  const [data, setData] = useState(null);

  const doFetch = () => 
    // Do your fetch-Logic
    setData(result);
  ;

  return  data, doFetch ;
;

改变钩子根本不处理任何状态。

如果你只想管理加载的数据在父组件中的状态,你可以通过 hook 提供包装好的 fetch 函数;类似的东西:

const doFetch = useFetch(kanye);
const [data, setData] = useState(null);
useEffect(() => 
  setData(doFetch()); // initialFetch
, []);

const getMore = () => 
  setData(doFetch())
;

// ...

然后,您需要将 useFetch-hook 的内部逻辑更改为没有任何内部状态,并且只公开包装的 fetch。它看起来像这样:

export const useFetch = (url) =>   
  const doFetch = () => 
    // Do your fetch-Logic
    return result;
  ;

  return doFetch;
;

【讨论】:

github.com/WebRuin/Kanye-/blob/master/pages/utils/getKanya.js

以上是关于如何使用反应钩子重新获取 API的主要内容,如果未能解决你的问题,请参考以下文章

停止重新渲染反应功能组件(使用钩子)

反应钩子如何确定它们的组件?

如何重新初始化 React 钩子

如何重新渲染 React 组件?

如何在反应中使用带有useState钩子的回调[重复]

如何将香草转换为反应钩子切换菜单