抽离接口请求的逻辑钩子

事实上,在处理这类请求的时候,模式都是类似的,通常都会遵循下面步骤:

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 };
};

 

posted @ 2022-03-08 16:34  古德拉克  阅读(32)  评论(0编辑  收藏  举报