抽离接口请求的逻辑钩子
事实上,在处理这类请求的时候,模式都是类似的,通常都会遵循下面步骤:
1.创建 data,loading,error 这 3 个 state;
2.请求发出后,设置 loading state 为 true;
3.请求成功后,将返回的数据放到某个 state 中,并将 loading state 设为 false;
4.请求失败后,设置 error state 为 true,并将 loading state 设为 false。
5.最后,基于 data、loading、error 这 3 个 state 的数据,UI 就可以正确地显示数据,或者 loading、error 这些反馈给用户了。
所以,通过创建一个自定义 Hook,可以很好地将这样的逻辑提取出来,成为一个可重用的模块。比如代码可以这样实现:
import { useState } from 'react';
const useAsync = (asyncFunction) => {
// 设置三个异步逻辑相关的 state
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
// 定义一个 callback 用于执行异步逻辑
const execute = useCallback(() => {
// 请求开始时,设置 loading 为 true,清除已有数据和 error 状态
setLoading(true);
setData(null);
setError(null);
return asyncFunction()
.then((response) => {
// 请求成功时,将数据写进 state,设置 loading 为 false
setData(response);
setLoading(false);
})
.catch((error) => {
// 请求失败时,设置 loading 为 false,并设置错误状态
setError(error);
setLoading(false);
});
}, [asyncFunction]);
return { execute, loading, data, error };
};

浙公网安备 33010602011771号