【发布时间】:2020-09-08 14:31:47
【问题描述】:
当我单击一个按钮时,我需要在我的 React 项目中获取一个 API,但如果我再次单击它不应重做 API 调用,而是检索最新获取的数据。
我知道可以记忆功能的钩子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的链接。
【问题讨论】:
-
您是否试图阻止 函数 被多次创建或阻止数据被多次获取。
useCallback使您不必在每次渲染时都创建一个函数。它不会记住它可能返回的数据。你仍然会继续调用 memoized 函数。 -
最简单的解决方案是检查
apiResponse变量是否已经填充到updateApiResult中
标签: javascript reactjs react-hooks