VueRequest
安装
1 2 3
| npm install vue-request
yarn add vue-request
|
用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <template> <div> <div v-if="loading">loading...</div> <div v-if="error">failed to fetch</div> <div v-if="data">Hey! {{ data }}</div> </div> </template>
<script lang="ts"> import { defineComponent } from 'vue'; export default defineComponent({ setup() { const { data, loading, error } = useRequest(service);
return { data, loading, error, }; }, }); </script>
|
集成Axios
安装
1 2 3
| npm install axios
yarn add axios
|
配置
1 2 3 4 5 6 7 8
| export default { baseURL: '', timeout: 60000, headers: { 'Content-Type': 'application/json;charset=UTF-8' } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import axios, { AxiosRequestConfig } from 'axios'; import baseConfig from '@/configs/config';
interface Code { [key: number]: string; }
const statusCode: Code = { 200: '请求成功!', 400: '请求参数或路径错误。', };
const errorHandler = (error: any) => { const { response } = error; if (response && response.status) { const { status } = response; if (status < 400) { }else if(status < 500){ } else { }
return response; };
const service = axios.create(baseConfig);
axios.interceptors.request.use( (config): AxiosRequestConfig<unknown> => { return config; } );
axios.interceptors.response.use( (res) => { return res; }, (error) => { errorHandler(error); return error; } );
export default service;
|
请求
1 2 3 4 5 6 7 8
| import axios from '@/plugins/axios';
export const getUser = (params: object) => { return axios.get('api/user', { params }); };
|
封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
import { useRequest as vueRequest } from 'vue-request'; import { BaseOptions } from 'vue-request/dist/types/core/types'; import { IService } from 'vue-request/dist/types/core/utils/types';
const useRequest = ( request: IService<unknown, any>, onSuccess?: (res: unknown) => void, defaultOption?: BaseOptions<unknown, any> ) => { return vueRequest(request, { manual: true, formatResult: (response) => response, loadingDelay: 500, debounceInterval: 1000, onSuccess: () => { }, onError: (error) => { }, ...(defaultOption || {}) }); };
export default useRequest;
|
使用
1 2 3 4 5 6
| import { getUser } from '@/api/base'; import useRequest from '@/plugins/action';
const { data, run } = useRequest(getUser); run({ id: '112233' });
|
错误处理
- 错误处理有两种方式
- 交回给axios的
interceptors
中处理
- 交给VueRequest处理(本文)
1 2 3 4 5 6
|
onError: (error) => { errorHandler(error); },
|
由于使用的其他服务器开发,使用到axios原本请求,故把错误处理交回axios处理
1 2 3 4 5 6 7 8 9 10
| axios.interceptors.response.use( (res) => { return Promise.resove(res); }, (error) => { errorHandler(error); return Promise.reject(error); } );
|