javascript - 使用 useCallback Hook 内存 API 响应

标签 javascript reactjs react-hooks

当我点击一个按钮时,我需要在我的 React 项目中获取一个 API,但如果我再次点击它应该不会重做 API 调用,而是检索最新获取的数据。

我知道钩子(Hook)useCallback可以内存功能。所以我只是将我的 API 调用放在 useCallback 中:

  const memoizedApiResponse = React.useCallback(async () => {
    console.log("fetch is called again :(");
    let response = await fetch("https://api.stackexchange.com/2.2/users?order=desc&sort=reputation&site=stackoverflow");

    return await response.text();
  }, []);

所以当我点击按钮时,我只是调用这个内存函数:

import React from "react";

const App = () => {
  const [apiResponse, setApiResponse] = React.useState(undefined);

  const memoizedApiResponse = React.useCallback(async () => {
    console.log("fetch is called again :(");
    let response = await fetch(
      "https://api.stackexchange.com/2.2/users?order=desc&sort=reputation&site=stackoverflow"
    );

    return await response.text();
  }, []);

  const updateApiResult = async () => {
    const apiResponse = await memoizedApiResponse();
    setApiResponse(apiResponse);
  };

  return (
    <div className="App">
      <button onClick={updateApiResult}>fetch API</button>
      <p>{apiResponse}</p>
    </div>
  );
};

export default App;

但遗憾的是每次点击都会发送请求(您可以在控制台中看到消息)。您知道如何使用 useCallback 内存请求响应吗?

这是 codesandbox 的链接.

最佳答案

memoizedApiResponse 不是它的名字所暗示的(内存 API 响应),它是一个内存函数,可以从应用程序接口(interface)。您只是在为自己节省获取数据的函数的创建时间,而不是实际检索数据的时间。

此外,useCallback 可能不会为您节省太多。我建议你阅读这篇文章:When to useMemo and useCallback它确实有助于理解其中一些内存 Hook 的作用以及它们何时真正帮助您。

我想你想要这个

import React from "react";

const App = () => {
  const [apiResponse, setApiResponse] = React.useState(undefined);
  
  const getData = async () => {
    if (apiResponse) {
      return apiResponse;
    }
  
    const response = await fetch("https://api.stackexchange.com/2.2/users?order=desc&sort=reputation&site=stackoverflow");
    const data = await response.text();
    setApiResponse(data);
  };

  return (
    <div className="App">
      <button onClick={getData}>fetch API</button>
      <p>{apiResponse}</p>
    </div>
  );
};

export default App;

关于javascript - 使用 useCallback Hook 内存 API 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63796102/

相关文章:

javascript - React Native 添加到状态数组

javascript - 当 useCallback 缺乏依赖项时,React useState 和 useCallback hook 如何工作

javascript - 当你使用 set 函数时,React 会克隆你的对象吗?

javascript - 如何循环并构建 IP 地址

javascript - ReactJs 中的内联 CSS 样式

javascript - QGIS - 创建使用实时数据的 map

node.js - Express - `req.body` 始终为空

css - 如何在剪贴板中复制颜色,reactjs

javascript - Dropzone js - maxFiles 不工作

javascript - 从浏览器中的对象获取数据