次要应用以下文件

config.js:ajax 申请配置外围文件

loading.js:element-ui 申请加载动画

index.js:二次封装 config.js 申请并导出该办法,配置申请拦截器、响应拦截器

index.vue:调用 ajax 的示例页面

留神:举荐在 api 目录对立治理所有接口,如果遇到报错请调整正确援用门路

config.js

import loading from './loading.js'; // 加载动画类const animation = false; // 接口加载动画const intTimer = 10; // 接口申请超时工夫(秒)class Config {    constructor(data) {        this.method = data.method;        this.url = data.url;        this.param = data.param || {};        this.header = data.header || {};        this.interceptors = data.interceptors;        this.response = data.response;        return this.filter();    }    // 创立XHR对象    createXHR() {        if (window.XMLHttpRequest) {            // code for IE7+, Firefox, Chrome, Opera, Safari            return new XMLHttpRequest();        } else {            // code for IE6, IE5            return new ActiveXObject('Microsoft.XMLHTTP');        }    }    // HTTP申请    xhrRequest(header, method, url, param, async, interceptors, response) {        return new Promise(resolve => {            var xhr = this.createXHR();            if (animation == true) {                loading.requestStart(); // 执行动画            }            // 申请拦挡            if (interceptors({ header, method, url: this.url, param: this.param, async })) {                xhr.open(method, url, async);                xhr.timeout = 1000 * intTimer; //设置xhr申请的超时工夫                Object.keys(header).map(key => {                    xhr.setRequestHeader(key, header[key]);                });                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; application/json; charset=utf-8');                xhr.send(param);                xhr.onreadystatechange = () => {                    if (xhr.readyState == 4 && xhr.status == 200) {                        loading.requestEnd(); // 完结动画                        try {                            let data = JSON.parse(xhr.responseText);                            resolve(response(data, { header, method, url: this.url, param: this.param, async }));                        } catch (error) {                            console.log('接口返回没有任何信息!');                            resolve(false);                        }                    } else {                        return 'request is unsucessful ' + xhr.status;                    }                };            } else {                console.error('request interceptor', '申请未收回, 申请拦截器已失效!');            }            // 申请超时办法            xhr.ontimeout = function(e) {                console.log('接口申请超时!');                loading.requestEnd(); // 完结动画            };            // 申请错误方法            xhr.onerror = function(e) {                console.log('接口申请失败');                loading.requestEnd(); // 完结动画            };        });    }    // 参数转换    convParams(param) {        let mark = '?';        let hasMark = this.url.indexOf(mark) > 0; // 是否蕴含特殊字符        if (hasMark) {            mark = '&';        }        let newParams = '';        let i = 0;        for (let key in param) {            if (i > 0) {                newParams += `&${key}=${param[key]}`;            } else {                newParams += `${mark}${key}=${param[key]}`;            }            i++;        }        return newParams;    }    // 数据GET、POST申请解决    filter() {        let obj = {            header: this.header,            method: this.method,            url: this.url,            param: {},            async: true,            interceptors: this.interceptors,            response: this.response        };        // 接口名称拼接地位:(1、url) (2、param)        let newParams = this.convParams(this.param);        if (this.method == 'GET') {            obj.url += newParams;        } else {            newParams = newParams.replace('?', '');            obj.param = newParams;        }        return this.xhrRequest(obj.header, obj.method, obj.url, obj.param, obj.async, obj.interceptors, obj.response);    }}export default Config;

loading.js

import { Loading } from 'element-ui';class animation {    constructor() {        this.needLoadingRequestCount = 0;        this.loading    }    /**     * 动画开始     */    requestStart() {        if (this.needLoadingRequestCount === 0) {            this.loading = Loading.service({                lock: true,                text: 'loading...',                background: 'rgba(0, 0, 0, 0.7)'            });        }        this.needLoadingRequestCount++;    }    /**     * 动画完结     */    requestEnd() {        if (this.needLoadingRequestCount <= 0) return;        this.needLoadingRequestCount--;        if (this.needLoadingRequestCount === 0) {            this.loading.close();        }    }}export default new animation()

index.js

import Config from './config.js';/** * 接口申请办法 * @func request * @param {Object} method 申请形式: 仅反对GET、POST * @param {String} url 申请地址 * @param {Object} param 申请参数 */let request = option => {    // 配置默认申请参数    return new Config({        header: {            Authorization: 'APPCODE edc39cc1dc5f4c139498322115b99e51'        },        method: option.method,        url: option.url,        param: option.param,        interceptors: interceptors,        response: response    });};/** * 申请拦截器 * @func interceptors */let interceptors = config => {    return true;};/** * 响应拦截器 * @func response */let response = (data, config) => {    let res;    // 解决返回格局    if (data.res) {        res = data.res;    } else if (data.data) {        res = data.data;    } else {        res = data;    }    return res;};export default request;

index.vue

<script>import request from './index.js';export default {    mounted() {        new request({            method: 'GET', // 申请形式: GET、POST            url: 'http://10.10.10.10/xxx/xxx', // 申请地址            param: {} // 申请参数        }).then(res => {            console.log('res', res);        });    }};</script>

文章的内容/灵感都从下方内容中借鉴

  • 【继续保护/更新 500+前端面试题/笔记】https://github.com/noxussj/In...
  • 【大数据可视化图表插件】https://www.npmjs.com/package...
  • 【利用 THREE.JS 实现 3D 城市建模(珠海市)】https://3d.noxussj.top/