Vue - 封装Axios,并给每次请求加上加载动画

Vue - 封装Axios,并给每次请求加上加载动画,第1张

1. 准备 1.1 导入Element-UI 在项目中新建终端,输入以下命令:
npm install element-ui -S
在main.js中进行配置
import ElementUI from 'element-ui';  //  导入element-ui包
import 'element-ui/lib/theme-chalk/index.css';  //  导入样式
Vue.use(ElementUI);  //  进行引用
1.2 导入axios 在项目中新建终端,输入以下命令:
npm install axios --save
在main.js中进行配置
import service from 'axios'
Vue.prototype.$axios = service
1.3 导入qs 在项目中新建终端,输入以下命令:
npm install qs
在main.js中进行配置
import qs from 'qs'
Vue.prototype.$qs = qs

引入上述3个库后,新建一个Request.js文件

2. 加载动画代码
import { Loading } from 'element-ui';

let loading;
let loadingNum = 0;  //  内存中正在请求的数量

function startLoading() {  //  打开加载动画
    if(loadingNum == 0) {
        loading = Loading.service({
            lock: true,
            text: '拼命加载中...',
            background:'rgba(255,255,255,0.5)',
            target: document.querySelector('.content')
        })
    }
    loadingNum++;
}

function endLoading() {  //  关闭加载动画
    loadingNum--;
    if(loadingNum <= 0) {
        loading.close();
    }
}

上述代码是加载动画的代码,大家可以单独在其他地方使用

3. 完整代码
import axios from 'axios';
import qs from 'qs'
import { MessageBox, Loading } from 'element-ui';

let loading;
let loadingNum = 0;  //  内存中正在请求的数量

function startLoading() {
    if(loadingNum == 0) {
        loading = Loading.service({
            lock: true,
            text: '拼命加载中...',
            background:'rgba(255,255,255,0.5)',
            target: document.querySelector('.content')
        })
    }
    loadingNum++;
}

function endLoading() {  //  关闭加载动画
    loadingNum--;
    if(loadingNum <= 0) {
        loading.close();
    }
}

/*
	baseURL:基本地址
	所有发送到后端的请求都会经过这里,然后在访问的url前拼接上baseURL,从而获得真正的访问地址
	举例:  url: /request
		   经过这里后,与baseURL进行拼接,变成:baseURL/request
	所以在使用封装的Axios时,url只需写baseURL后的地址即可
*/
const service  = axios.create({
    baseURL: process.env.API_ROOT,  //  基本地址
    responseType: 'json',
    withCredentials: true,  //  允许跨域设置,不然可能因为拿不到cookie而报错
    timeout: 1000 * 10  //  设置请求超时时间,单位为毫秒
})

/* 
	环境的切换,可以根据不同的环境设置不同的请求基本地址
	根据需要进行修改即可
*/
if (process.env.NODE_ENV == 'development') {    
    service.defaults.baseURL = 'http://192.168.74.1:8888/';
} else if (process.env.NODE_ENV == 'debug') {    
    service.defaults.baseURL = 'http://192.168.74.1:8888/';
} else if (process.env.NODE_ENV == 'production') {    
    service.defaults.baseURL = 'http://192.168.74.1:8888/';
}

//  请求拦截器
service.interceptors.request.use(
    config => {
        startLoading();  //  打开加载动画

        if (config.meth === 'post' && !(config.data instanceof FormData)) {
            config.data = qs.stringify(config.data, {
                arrayFormat: 'repeat'  //  后端要求传数组的时候做的设置
            })
        }
        
        // 将token放到请求头中发送给服务器
        if (window.localStorage.getItem('token')) {
            config.headers.common['Access-Token'] = window.localStorage.getItem('token');
        }

        return config;
    },
    error => {
        return Promise.error(error)
    }
)

// 响应拦截器
service.interceptors.response.use( 
    response => {
        endLoading();  //  关闭加载动画

        /*  
        	如果返回的状态码为200,说明接口请求成功,可以正常拿到数据
        	否则的话抛出错误 
        */    
        if (response.status === 200) {        
            return Promise.resolve(response.data);        
        } else {         
            return Promise.reject(response);        
        }    
    },    
    
    /* 
    	服务器状态码不是2开头的的情况
        要和后台统一的错误状态码    
        然后根据返回的状态码进行一些 *** 作,例如登录过期提示,错误提示等等
    */
    error => {
        endLoading();  //  关闭加载动画
        if (error && error.response && error.response.status) {
            switch (error.response.status) {                               
                case 401:
                    MessageBox({
                        message: '未授权,请重新登录',
                        type: 'error',
                        title: '提示'
                    })      
                    break;           
                case 402:
                    MessageBox({
                        message: '登录过期,请重新登录',
                        type: 'error',
                        title: '提示'
                    });               
                    break; 
                case 403:
                    MessageBox({
                        message: '拒绝访问',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 404:
                    MessageBox({
                        message: '网络请求不存在',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 405:
                    MessageBox({
                        message: '请求方法不允许',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 408:
                    MessageBox({
                        message: '请求超时,请稍后再试',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 429:
                    MessageBox({
                        message: '服务器繁忙,请稍后再试',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 500:
                    MessageBox({
                        message: '服务器端错误',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 501:
                    MessageBox({
                        message: '网络未实现',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 502:
                    MessageBox({
                        message: '网络错误',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 503:
                    MessageBox({
                        message: '服务不可用',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 504:
                    MessageBox({
                        message: '网络超时',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                case 50:
                    MessageBox({
                        message: 'http版本不支持该请求',
                        type: 'error',
                        title: '提示'
                    });
                    break;
                // 其他错误,直接抛出错误提示
                default:
                    MessageBox({
                        message: '服务器内部错误,请稍后再试',
                        type: 'error',
                        title: '提示'
                    });
            }
            return Promise.reject(error);
        }
    }    
);

export default service;
4. 使用举例

注意上述代码的最后一句:“export default service”,意味着在引入上述JS文件中封装的Axios时,是以变量名“service”进行引用的

4.1 GET请求举例
import { MessageBox } from "element-ui";
import service from "../request";  //  修改为自己的地址

/*
	异步模式
*/
export async function requestInitData(param) {
    try {
        const response = await service({
            url: '自己的访问地址',
            method: 'GET',
            params: {
                "参数1": param
            }
        });
		console.log(response);
    } catch (error) {
        MessageBox({
            title: '提示',
            message: '请求失败失败,请稍后再试',
            type: 'error'
        });
    }
}
4.2 POST请求举例
import { Message } from "element-ui";
import service from "../request";  //  修改为自己的地址

/*
	异步模式
*/
export async function requestInitData(params) {
    return service({
        url: '自己的访问地址',
        method: 'POST',
        data: params,
        headers: {'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}  //  按自己需求进行修改
    }).then(response => {
        console.log(response);
    }).catch(error => {
        Message.error('请求失败,请稍后再试');
    })
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1324961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存