gpt4 book ai didi

reactjs - React Hooks - 处理异步 api 调用

转载 作者:行者123 更新时间:2023-12-05 07:18:13 27 4
gpt4 key购买 nike

我正在尝试设置一个自定义 Hook 来处理我项目中的所有 api 提取。我可以成功调用电话并存储数据,但仅限于第一个电话之后的电话。我非常有信心,由于竞争条件和异步的性质,第一次调用不会返回任何内容。

这是我的钩子(Hook):

import { useState, useEffect } from 'react'
import api from 'services/api'

const useHopServiceApi = () => {
const [data, setData] = useState([])
const [url, setUrl] = useState('')
const [body, setBody] = useState({})
const [isLoading, setIsLoading] = useState(false)
const [isError, setIsError] = useState(false)

useEffect(() => {
const fetchData = async () => {
setIsError(false)
setIsLoading(true)
try {
const result = await api.post(url, body)
setData(result.d)
} catch (error) {
setIsError(true)
}
setIsLoading(false)
}
if (url && body) {
fetchData()
}
}, [url, body])
return [{ data, isLoading, isError }, setUrl, setBody]
}

export default useHopServiceApi

以及调用它的组件:

const HomePage = (props) => {
const [{ data, isLoading, isError }, doFetch, setBody] = useHopServiceApi()

const handleClickSelectInterests = () => {
setBody({ count: 1 })
doFetch('/GetPopularCities')
console.log('data:', data)
}
}

当我点击按钮(触发 api 调用)时,数据作为一个空数组被注销,但在随后的点击中,它被数据填充。

最佳答案

您在第一次点击后看不到数据的原因是您还没有在 doFetch 被调用后立即获得数据。

第二次单击按钮调用handleClickSelectInterests 数据被记录,但它是来自第一次渲染的数据。您可以很好地呈现更新后的数据,但是您无法在 handleClick 函数中记录最新的内容。

下面是一个例子来说明我的意思:

Code sandbox example

根组件:

import React from "react";
import ReactDOM from "react-dom";

import useHopServiceApi from "./useHopServiceApi";
import "./styles.css";

function App() {
const [{ data, isLoading, isError }, doFetch] = useHopServiceApi();
console.log("Data in render!", data);
const handleClick = () => {
doFetch("/fakeUrl");
// Data logged below will show the data from the previous request, not the latest
console.log("Data in handle click!", data);
};
return (
<div className="App">
{isLoading && <div>Is loading!</div>}
<button onClick={handleClick}>Simulate fetch!</button>
{data && <div>Data! {data}</div>}
</div>
);
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

你的钩子(Hook):

import { useState, useEffect } from "react";
let numClick = 1;

const simulatedFetch = () => {
return new Promise(resolve => {
setTimeout(() => {
resolve(`Fetch request data for request number ${numClick}`);
numClick++;
}, 2000);
});
};
const useHopServiceApi = () => {
const [data, setData] = useState([]);
const [url, setUrl] = useState("");
const [body, setBody] = useState({});
const [isLoading, setIsLoading] = useState(false);
const [isError, setIsError] = useState(false);

useEffect(() => {
const fetchData = async () => {
setIsError(false);
setIsLoading(true);
try {
const result = await simulatedFetch();
console.log("new result!", result);
setData(result);
setUrl("");
} catch (error) {
setIsError(true);
}
setIsLoading(false);
};
if (url) {
fetchData();
}
}, [url, body]);
return [{ data, isLoading, isError }, setUrl, setBody];
};

export default useHopServiceApi;

上面的例子表明你可以在 render 函数中使用最新的数据,即使你不能在 handleClick 函数中记录它

关于reactjs - React Hooks - 处理异步 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58453978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com