vue中axios的封装,axios typescript react
这篇文章主要介绍了Vue3打字稿封装爱可信并进行请求调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
不是吧,不是吧,原来真的有人都2021年了,连以打字打的文件都没听说过吧?在项目中使用以打字打的文件虽然短期内会增加一些开发成本,但是对于其需要长期维护的项目,打字稿能够减少其维护成本,使用以打字打的文件增加了代码的可读性和可维护性,且拥有较为活跃的社区,当居为大前端的趋势所在,那就开始淦起来吧~
使用TypeScript封装基础axios库
代码如下:
//http.ts
从" axios "导入axios,{ AxiosRequestConfig,AxiosResponse }
从“元素加”导入{ ElMessage }
const showStatus=(状态:数字)={
let message=
开关(状态){
案例400:
消息=请求错误(400)
破裂
案例401:
消息=未授权,请重新登录(401)
破裂
案例403:
消息=拒绝访问(403)
破裂
案例404:
消息=请求出错(404)
破裂
案例408:
消息=请求超时(408)
破裂
案例500:
消息=服务器错误(500)
破裂
案例501:
消息=服务未实现(501)
破裂
案例502:
消息=网络错误(502)
破裂
案例503:
消息=服务不可用(503)
破裂
案例504:
消息=网络超时(504)
破裂
案例505:
message=HTTP版本不受支持(505)
破裂
默认值:
消息=`连接出错(${status})!`
}
返回${ message },请检查网络或联系管理员!`
}
const service=axios.create({
//联调
//基本URL:process。环境。node _ ENV=== production ?`/` : /api ,
baseURL:"/API ",
标题:{
获取:{
content-Type ":" application/x-www-form-urlencoded;charset=utf-8
},
帖子:{
内容类型":"应用程序/JSON;charset=utf-8
}
},
//是否跨站点访问控制请求
withCredentials: true,
超时:30000,
transformRequest: [(data)={
data=JSON.stringify(data)
返回数据
}],
validateStatus() {
//使用异步等待,处理拒绝情况较为繁琐,所以全部返回决心,在业务代码中处理异常
返回真实的
},
transformResponse: [(data)={
if(数据类型=== string 数据。以( { ){
data=JSON.parse(data)
}
返回数据
}]
})
//请求拦截器
服务。截击机。请求。使用((config:AxiosRequestConfig)={
//获取令牌,并将其添加至请求头中
让token=本地存储。getitem( token )
if(token){
配置。标题。authorization=` $ { token }
}
返回配置
},(错误)={
//错误抛到业务代码
error.data={}
error.data.msg=服务器异常,请联系管理员!
返回承诺。解决(错误)
})
//响应拦截器
服务。截击机。回应。使用((response:axios response)={
常量状态=响应.状态
设msg=
如果(状态200 状态=300) {
//处理超文本传送协议(超文本传输协议的缩写)错误,抛到业务代码
msg=showStatus(状态)
if(响应类型。data=== string ){
response.data={ msg }
}否则{
response.data.msg=msg
}
}
返回响应
},(错误)={
if (axios.isCancel(错误)){
console.log(重复请求:错误.消息)
}否则{
//处理错误代码
//错误抛到业务代码
error.data={}
error.data.msg=请求超时或服务器异常,请检查网络或联系管理员!
ElMessage.error(error.data.msg)
}
退货承诺。拒绝(错误)
})
导出默认服务
取消多次重复的请求版本
在上述代码加入如下代码:
//http.ts
从" axios "导入axios,{ AxiosRequestConfig,AxiosResponse }
从" qs "导入全国工业产品生产许可证
从“元素加”导入{ ElMessage }
//声明一个地图用于存储每个请求的标识和取消函数
待定常数=新映射()
/**
* 添加请求
* @param {Object}配置
*/
const add pending=(config:AxiosRequestConfig)={
常量url=[
方法,
config.url,
qs.stringify(config.params),
qs.stringify(config.data)
].联接("")
配置。取消令牌=配置。取消令牌 新axios .CancelToken(cancel={
如果(!pending.has(url)) { //如果悬而未决的中不存在当前请求,则添加进去
pending.set(url,取消)
}
})
}
/**
* 移除请求
* @param {Object}配置
*/
const remove pending=(config:AxiosRequestConfig)={
常量url=[
方法,
config.url,
qs.stringify(config.params),
qs.stringify(config.data)
].联接("")
if (pending.has(url)) { //如果在悬而未决的中存在当前请求标识,需要取消当前请求,并且移除
const cancel=pending.get(url)
取消(网址)
pending.delete(url)
}
}
/**
* 清空悬而未决的中的请求(在路由跳转时调用)
*/
导出常数clearPending=()={
for (const [url,cancel] of pending) {
取消(网址)
}
pending.clear()
}
//请求拦截器
服务。截击机。请求。使用((config:AxiosRequestConfig)={
removePending(config) //在请求开始前,对之前的请求做检查取消操作
添加待定(配置)//将当前请求添加到悬而未决的中
让token=本地存储。getitem( token )
if(token){
配置。标题。authorization=` $ { token }
}
返回配置
},(错误)={
//错误抛到业务代码
error.data={}
error.data.msg=服务器异常,请联系管理员!
返回承诺。解决(错误)
})
//响应拦截器
服务。截击机。回应。使用((response:axios response)={
removePending(response) //在请求结束后,移除本次请求
常量状态=响应.状态
设msg=
如果(状态200 状态=300) {
//处理超文本传送协议(超文本传输协议的缩写)错误,抛到业务代码
msg=showStatus(状态)
if(响应类型。data=== string ){
response.data={ msg }
}否则{
response.data.msg=msg
}
}
返回响应
},(错误)={
if (axios.isCancel(错误)){
console.log(重复请求:错误.消息)
}否则{
//处理错误代码
//错误抛到业务代码
error.data={}
error.data.msg=请求超时或服务器异常,请检查网络或联系管理员!
ElMessage.error(error.data.msg)
}
退货承诺。拒绝(错误)
})
导出默认服务
在路由跳转时撤销所有请求
在路由文件index.ts中加入
从" vue路由器"导入{ createRouter,createWebHistory,RouteRecordRaw }
从" @/views/Login/Login.vue "导入登录
//引入在爱可信暴露出的清除待定函数
从" @/api/axios "导入{ clearPending }
.
.
.
const router=createRouter({
history:createWebHistory(进程。环境。base _ URL),
路线
})
router.beforeEach(收件人,发件人,下一个)={
//在跳转路由之前,先清除所有的请求
clearPending()
//.
下一个()
})
导出默认路由器
使用封装的axios请求库
封装响应格式
//接口响应通过格式
导出接口HttpResponse {
状态:数字
statusText:字符串
数据:{
代码:数字
desc:弦乐
[key: string]:任意
}
}
封装接口方法
举个栗子,进行封装用户接口,代码如下~
从导入Axios ./axios
从" @/@类型"导入{ HttpResponse }
/**
* @interface loginParams -登录参数
* @property {string}用户名-用户名
* @property {string}密码-用户密码
*/
界面登录参数{
用户名:字符串
密码:字符串
}
//封装用户类型的接口方法
导出类用户服务{
/**
* @描述查询用户的信息
* @param {number} teamId -所要查询的团队身份
* @返回{HttpResponse}结果
*/
静态异步登录(params:log in params):PromiseHttpResponse {
返回Axios(/api/user ,{
方法:“得到”,
响应类型: json ,
参数:{
.参数
},
})
}
静态异步注册器(params:log in params):promise httpresponse {
返回Axios(/API/用户/注册,{
方法:“得到”,
响应类型: json ,
参数:{
.参数
},
})
}
}
项目中进行使用
代码如下:
模板
输入类型= text v-model= Account placeholder=请输入账号name=用户名
输入类型= text v-model= Password placeholder=请输入密码name=用户名
按钮@点击。prevent= handle register()登录/按钮
/模板
脚本语言
从“vue”导入{ defineComponent,reactive,toRefs }
//引入接口
从" @/API/用户"导入{用户服务}
导出默认定义组件({
setup() {
恒定状态=反应({
帐户: admin ,//账户
密码: hhhh ,//密码
})
const handleLogin=async ()={
const loginParams={
用户名:州。账户,
密码:州。密码,
}
const RES=await userservice。登录(登录参数)
console.log(res)
}
const handleRegister=async ()={
const loginParams={
用户名:州。账户,
密码:州。密码,
}
const RES=await userservice。重新注册(登录参数)
console.log(res)
}
返回{
.toRefs(州),
handleLogin,
句柄寄存器
}
},
})
/脚本
到此这篇关于Vue3打字稿封装爱可信并进行请求调用的实现的文章就介绍到这了,更多相关Vue3打字稿封装爱可信内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。