vue工程全局设置ajax的等待动效

7次阅读

共计 1346 个字符,预计需要花费 4 分钟才能阅读完成。

最近在做 vue 的项目,使用了 element-ui 作为 ui 组件库,采用 vuex 进行状态管理,与后台的请求交互采用 axios 库实现,原本做的页面,ajax 请求个数也只有三个,将等待动画的显示和隐藏通过 mutation 去控制,但是项目越来越大,请求也越来越多,能否将这个等待动画与 ajax 的请求相关联呢?
实现等待动效
在 element-ui 中,提供了两个方法进行调用 loading 组件,一个是在需要遮罩的 div 容器中添加 v -loading 指令,另一种就是以服务形式调用:Loading.service(options),在本项目中,在加载数据时,进行全局遮罩,所以设置 let loadingInstance = Loading.service({fullscreen:true})。关闭服务形式的调用:loadingInstance.close();
axios 的拦截器
个人对拦截器的作用的理解是,在请求发送前和响应处理前,对该 ajax 请求进行一定的设置或者处理,方便对工程内的 ajax 请求进行统一处理,减少重复代码。
// 请求拦截器
axios.interceptors.request.use((config) => {
// 在发送请求之前做些什么
return config;
}, (error) => {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use((response) => {
// 对响应数据做点什么
return response;
}, (error) => {
// 对响应错误做点什么
return Promise.reject(error);
});
有了拦截器,我们可以想到,在 ajax 请求发送前开启 loading 动画,在接收响应后关闭 loading 动画。但是要对每个 ajax 都开关一下 loading 动画吗?其实不必。只需要实现一个 ajax 的计数器,在个数大于 0 时,开启动画,在个数为 0 的时候,关闭动画。
计数器实现
let loadingInstance;
let loadCounter = {
count:0,
show:() => {
if(count < 0){
this.count ++;
loadingInstance = Loading.service({fullscreen:true});
}
},
hide:()=>{
if(count > 0){
this.count –;
this.$nextTick(()=>{// 以服务的方式调用的 Loading 需要异步关闭
loadingInstance.close();
});
}
}
}
使用方法
// 请求拦截器
axios.interceptors.request.use((config) => {
loadCounter.show();
return config;
}, (error) => {
return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use((response) => {
loadCounter.hide();
return response;
}, (error) => {
return Promise.reject(error);
});

正文完
 0