axios
相对于原生axios解决问题:
- 加入节流自动过滤多余的重复请求,节省带宽同时,一定程度防止表单短时间重复提交的问题
- vue页面销毁自动取消未完成的请求,节省页面资源
- 在有必要的情况下,可手动终止当前请求
- 响应式用法
- 响应默认值设置
- 增加path传参模式
安装
sh
pnpm add @howuse/axios axios
sh
npm i @howuse/axios axios
sh
yarn add @howuse/axios axios
实例创建-请求拦截器、响应拦截器
在初始化创建,保留原有的 AxiosInstance 结构。如果有必要,也可以使用默认的 server
<script setup lang="ts">
import { createAxios } from "@howuse/axios";
const { useAxiosRequest, useBlobDownload, server } = createAxios({
baseURL: "/",
timeout: 0
});
// 请求拦截器
server.interceptors.request.use(
config => {
const token = sessionStorage.getItem("USER_TOKEN")
if (!token) {
console.warn("token获取失败...")
}
if (config.headers) {
config.headers.Authorization = `Bearer ${token || process.env.VUE_APP_TOKEN}`
}
});
// 响应拦截器 适合做一些不影响数据结构的操作,例如token失效返回登录页面等
server.interceptors.response.use(
(response) => {
// return response.data
// 网上许多示例将此处直接设置为 response.data ,一定程度上影响未来响应头的获取,一旦需要使用响应头时,变得异常困难
// 正确的方式应该是将响应的server二次封装
return response
},
(error) => {
console.log(error);
}
)
</script>
请求
带防抖的请求,通过isDebounce设置实际上内部默认开启防抖,通过defaultVal可设置返回默认值
<template>
<el-button type="primary" @click="request()">请求接口</el-button>
<p>请求结果:{{ data }}</p>
</template>
<script lang="ts" setup>
import { ElMessage, ElButton } from "element-plus";
import { createAxios } from "@howuse/axios";
import { watch } from "vue";
const { useAxiosRequest } = createAxios({
baseURL: "//www.httpbin.org",
});
const { data, response, loading, finished, execute, edata } = useAxiosRequest<any>(
{
url: "/anything",
method: "post",
},
{
defaultVal: {}, // 设置默认响应值,默认是 []
isDebounce: true
}
);
// 响应式用法
watch(finished, (finished) => finished && ElMessage.info("响应式调用完成"))
// 一般请求用法
function request() {
execute().then((data) => {
ElMessage.info(`一般调用完成`);
});
execute().then((data) => {
ElMessage.info(`一般调用完成`);
});
execute().then((data) => {
ElMessage.info(`一般调用完成`);
});
}
</script>
blob文件下载
后端经常返回流文件供前端下载,本方法封装自动读取文件名(响应头允许的话,否则自行设置)、自动读取文件类型,方便正确文件格式转换
<template>
<el-button type="primary" @click="downloadPng()">下载</el-button>
</template>
<script lang="ts" setup>
import { createAxios } from "@howuse/axios";
import { ElButton } from "element-plus";
const { useBlobDownload } = createAxios({
baseURL: "//www.httpbin.org",
});
const { execute: downloadPng } = useBlobDownload(
{
url: "/image/png",
},
{
fileName: "图片.png",
}
);
</script>
<style lang="less" scoped></style>