简体中文 | [English](./README.md)

@axios-use/react - 一个 Axios 的 React Hook 插件,小而美 @axios-use/react - 一个 Axios 的 React Hook 插件,小而美
一个 Axios 的 React Hook 插件,小而美

NPM version NPM old version install size minzipped size ci license



npm i axios @axios-use/react


## 使用 ### 快速开始 ```js import { useResource } from "@axios-use/react"; function Profile({ userId }) { const [{ data, error, isLoading }] = useResource((id) => ({ url: `/user/${id}` }), [userId]); if (error) return
failed to load
; if (isLoading) return
loading...
; return
hello {data.name}!
; } ``` ```tsx import { useRequest, useResource } from "@axios-use/react"; ``` ### RequestProvider ```tsx import axios from "axios"; import { RequestProvider } from "@axios-use/react"; // custom Axios instance. https://github.com/axios/axios#creating-an-instance const axiosInstance = axios.create({ baseURL: "https://example.com/", }); ReactDOM.render( // custom instance , document.getElementById("root"), ); ``` #### RequestProvider 配置 | config | type | explain | | -------------------- | --------------- | ---------------------------------------------------------- | | instance | object | 自定义 Provider 下的 Axios 实例 | | cache | object \| false | 自定义 Provider 下的 Cache 对象,或关闭。 (**默认开启**) | | cacheKey | function | 自定义 Provider 下的生成 Cache key 函数 | | cacheFilter | function | 缓存筛选器,自定义 Provider 下的过滤响应缓存,决定是否存储 | | customCreateReqError | function | 自定义 Provider 下的格式化错误响应 | ### useRequest | option | type | explain | | ------------------- | --------------- | ------------------------- | | fn | function | 传递 Axios 请求配置的函数 | | options.onCompleted | function | 请求成功的回调函数 | | options.onError | function | 请求失败的回调函数 | | options.instance | `AxiosInstance` | 自定义当前项的 Axios 实例 | ```tsx // js const [createRequest, { hasPending, cancel }] = useRequest((id) => ({ url: `/user/${id}`, method: "DELETE", })); // tsx const [createRequest, { hasPending, cancel }] = useRequest((id: string) => // response.data: Result. AxiosResponse request({ url: `/user/${id}`, method: "DELETE", }), ); ``` ```tsx interface CreateRequest { // Promise function ready: () => Promise<[Payload, AxiosResponse]>; // Axios Canceler. clear current request. cancel: Canceler; } type HasPending = boolean; // Axios Canceler. clear all pending requests(CancelTokenSource). type Cancel = Canceler; ``` ```jsx useEffect(() => { const { ready, cancel } = createRequest(id); ready() .then((res) => { console.log(res); }) .catch((err) => { console.log(err); }); return cancel; }, [id]); ``` ```tsx // options: onCompleted, onError const [createRequest, { hasPending, cancel }] = useRequest( (id) => ({ url: `/user/${id}`, method: "DELETE", }), { onCompleted: (data, response) => console.info(data, response), onError: (err) => console.info(err), }, ); ``` ### useResource | option | type | explain | | -------------------- | --------------------------- | --------------------------------------------------------------------- | | fn | function | 传递 Axios 请求配置的函数 | | parameters | array \| false | 传递 Axios 配置函数参数的数组对象,effect 依赖项。`false`关闭依赖响应 | | options.cache | object \| false | 自定义 Cache 对象,或关闭。 (**默认继承全局**) | | options.cacheKey | string\| number \| function | 自定义生成 Cache key 函数 | | options.cacheFilter | function | 缓存筛选器,自定义过滤响应缓存,决定是否存储 | | options.filter | function | 请求筛选器,决定是否发起请求 | | options.defaultState | object | State 的初始化值. `{data, response, error, isLoading}` | | options.onCompleted | function | 请求成功的回调函数 | | options.onError | function | 请求失败的回调函数 | | options.instance | `AxiosInstance` | 自定义当前项的 Axios 实例 | ```tsx // js const [{ data, error, isLoading }, fetch, refresh] = useResource((id) => ({ url: `/user/${id}`, method: "GET", })); // tsx const [reqState, fetch, refresh] = useResource((id: string) => // response.data: Result. AxiosResponse request({ url: `/user/${id}`, method: "GET", }), ); ``` ```tsx interface ReqState { // Result data?: Payload; // axios response response?: AxiosResponse; // normalized error error?: RequestError>; isLoading: boolean; cancel: Canceler; } // 不会调用 `options.filter` 函数 type Fetch = (...args: Parameters) => Canceler; // 1. 与 `fetch` 函数类似, 但是没有传参, 保持使用 `useResource` 声明时传参 // 2. 会调用 `options.filter` 函数进行过滤操作 type Refresh = () => Canceler | undefined; ``` 将其参数作为依赖项传递给 `useResource`,根据参数变化自动触发请求 ```jsx const [userId, setUserId] = useState(); const [reqState] = useResource( (id) => ({ url: `/user/${id}`, method: "GET", }), [userId], ); // no parameters const [reqState] = useResource( () => ({ url: "/users/", method: "GET", }), [], ); // conditional const [reqState, request] = useResource( (id) => ({ url: `/user/${id}`, method: "GET", }), [userId], { filter: (id) => id !== "12345", }, ); request("12345"); // custom request is still useful // options: onCompleted, onError const [reqState] = useResource( () => ({ url: "/users/", method: "GET", }), [], { onCompleted: (data, response) => console.info(data, response), onError: (err) => console.info(err), }, ); ``` #### cache https://codesandbox.io/s/react-request-hook-cache-9o2hz ### 其他 #### request `request` 作用于 Typescript 类型推导,便于识别 response 类型 ```tsx const api = { getUsers: () => { return request({ url: "/users", method: "GET", }); }, getUserInfo: (userId: string) => { return request({ url: `/users/${userId}`, method: "GET", }); }, }; ``` 当然你也可以直接使用 `axios` 调用 `request` 方法 ```ts const usersRes = await axios(api.getUsers()); const userRes = await axios(api.getUserInfo("ID001")); ``` 自定义 response 类型. (如果你有手动修改 response 数据的需求。 axios.interceptors.response) ```ts import { request, _request } from "@axios-use/react"; const [reqState] = useResource(() => request({ url: `/users` }), []); // AxiosResponse reqState.response; // DataType reqState.data; // 自定义 response 类型 const [reqState] = useResource(() => _request>({ url: `/users` }), []); // MyWrapper reqState.response; // MyWrapper["data"]. maybe `undefined` type. reqState.data; ``` #### createRequestError `createRequestError` 用于规范错误响应(该函数也默认在内部调用)。 `isCancel` 标志被返回,因此也不必在 promise catch 块上调用 **axios.isCancel**。 ```tsx interface RequestError { data?: T; message: string; code?: string | number; isCancel: boolean; original: AxiosError; } ``` ## 许可证 [MIT](./LICENSE)