抽离接口请求的逻辑钩子
事实上,在处理这类请求的时候,模式都是类似的,通常都会遵循下面步骤:
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 }; };