Skip to content

useFetch

用于发起请求的hook,支持数据success回调、error回调、finally回调。

一般会在项目中重写该hook,因为每个项目的api接口返回结构不同,可参考下面的源码进行修改。

代码示例

ts
useFetch({
  request: () => axios.get('/api'),
  onSuccess: (data) => {
    console.log('success callback', data);
  },
  onError: (err) => {
    console.error('error callback', err);
  },
  onFinally: () => {
    console.log('finally callback');
  },
  codeField: 'code', // 服务器状态码字段
  dataField: 'data', // 服务器数据字段
});

参数

参数说明类型默认值是否必填
request必填项,请求数据的函数() => Promise<AxiosResponse<any>>-
onSuccess必填项,请求成功的回调函数(data: any) => void-
onError可选项,请求失败的回调函数(err: any) => void-
onFinally可选项,请求结束的回调函数() => void-
codeField可选项,服务器状态码字段stringcode
dataField可选项,服务器数据字段stringdata

源码

ts
import type { AxiosResponse } from "axios";

export interface UseFetchOptions {
    request: () => Promise<AxiosResponse<any>>;
    onSuccess: (data: any) => void;
    onError?: (err: any) => void;
    onFinally?: () => void;
    codeField?: string; // 服务器状态码字段
    dataField?: string; // 服务器数据字段
}

// 封装请求的公共函数
export const useFetch = ({
    request,
    onSuccess,
    onError,
    onFinally,
    codeField = 'code',
    dataField = 'data',
}: UseFetchOptions) => {

    // 参数校验
    if (!request) {
        throw new Error('useFetch: request is required');
    }
    if (!onSuccess) {
        throw new Error('useFetch: onSuccess is required');
    }

    request().then((res) => {
        if (![0, 200].includes(res.data[codeField])) {
            onError && onError(res.data);
            return;
        }
        onSuccess(res.data[dataField]);
    }).catch((err) => {
        onError && onError(err);
    }).finally(() => {
        onFinally && onFinally();
    })
}