【发布时间】:2021-08-21 15:59:20
【问题描述】:
在我的 React 功能组件中,我有以下代码;
const user = useFetch('api/userinfo', {});
本质上,这是一个自定义钩子调用,在内部它有一个对 API 的 fetch 调用并设置数据(下面是 usefetch 中的相关代码);
const [data, setData] = useState(initialData);
//....fetch call
setData(json); // once data is fetched
在我的主要组件中,由于我的网格依赖于这些数据,我如何让代码等待继续到 Grid jsx 直到获取数据?我打算使用 async..await。但不确定是否可以在这里使用自定义钩子来做到这一点?
使用下面的代码,似乎由于某种原因,钩子被多次调用;
export default function useFetch(initialUrl, initialData) {
const [url] = useState(initialUrl);
const [loadingData, setLoadingData] = useState(true);
const [data, setData] = useState(initialData);
useEffect(() => {
setLoadingData(true);
fetch(url)
.then(response => {
if (response.status === 200) {
response.json().then(json => {
setData(json);
setLoadingData(false);
});
})
}, [url]);
return [loadingData, data];
}
【问题讨论】:
-
我会设置一个加载状态,在获取开始时将其设置为 true,在成功获取数据或出现错误后将其设置为 false。然后在你的 jsx 中不显示网格,直到加载状态为 false
标签: reactjs react-hooks react-functional-component