vue-cli中怎么基于axios去封装方法

**你们好,我是minijie,潜水于掘金和思否的一名前端小小生,今天看了几篇文章关于vue中怎么去封装axios,视乎好多版本都是基于promise去作的。这让我很疑惑,axios不就是基于promise的一个请求库吗?为啥还要多一层promise呢?
下面是根据我本身的想法去基于axios+ansyc去封装一个本身用的请求库,有疑惑的能够在下方留言讨论**
一、首先经过npm去下载axios(我推荐使用cnpm,比较是国内快一点)前端

npm install axios

二、在vue-cli中 src目录中建立一个叫api的文件夹(固然名字本身喜欢就能够了,取上面看本身),并在api文件中建立一个叫https.js文件vue

目录结果如图node

clipboard.png

三、在https.js文件中写代码:
首先导入aixos和vue模块 能够去官axios方先看看文档 ✈✈飞机ios

import axios from 'axios'
import Vue from 'vue'

环境的选择git

var BaseUrl = ""; //请求的地址由于我是用node代理测试环境已经配好了
if (process.env.NODE_ENV == 'development') {    
    //开发用的
    BaseUrl = '';
}
else if (process.env.NODE_ENV == 'debug') {    
// 调试用的
    BaseUrl = '';
}
else if (process.env.NODE_ENV == 'production') {    
// 线上环境
    BaseUrl = 'https://echarts.baidu.com/examples/';
}

写一个基础请求我这里命名为requestFNgithub

function requestFN(o) {
    //基础请求方法
    //o.type //请求类型
    //o.url //请求路径
    var obj = {
        method: o.type, //请求的类型        
        url: BaseUrl + o.url //请求地址
    }
    if (o.hasOwnProperty("params")) {
        obj.params = o.params; //url后面带参数 如 https://echarts.baidu.com/examples/a?test="1"
    } else if (o.hasOwnProperty("data")) {
        obj.data = o.data; // data 带参数
    }
    这里作好多事情好比说有没有携带token cookie这类没用确定要dosoming的啦,
    根据你的业务须要本身加吧,我这里就不写了,若有疑问能够留言我
    //返回axios的基础方法
    return axios(obj).then(r => {
        return r.data; //方法请求的数据
    })}

定义一个GET请求方法 我这里采用的是asyncvue-cli

async function getFN(o) {
    //get方法
    var result = await requestFN(o);
    return result;
}

定义一个POST方法也是如此npm

async function postFN(o) {
    //get方法
    var result = await requestFN(o);
    return result;
}

设置一下超时时间axios

axios.defaults.timeout = 10000;

最后咱们把它写在vue的原型上面,并暴露出去后端

const install = () => {
    Vue.prototype.getFN = getFN; //GET方法
    Vue.prototype.postFN = postFN; //POST方法
}
export default install;

固然不少时候咱们会处理一些异常的状态码,好比说后端大哥说没有token我这边会给你一个40103的状态码,你本身去作处理,这个时候咱们就要用到响应拦截器喽

axios.interceptors.response.use(
    response => {
      //成功请求的状态码
      //注意状态码是根据后端返回给个人,要本身根据业务需求去写我这里只是作实例
        if (response.status == 200) {
            return Promise.resolve(response);
        } else {
            return Promise.reject(response);
        }
    },
    error => {
        //失败请求的状态码
        if (error.response) {
            switch (error.response.status) {
                case 40103:
                    router.replace({ path: '/login' });
                    localStorage.removeItem("tokenValue");
                    break;
            }
            return Promise.reject(error.response.data)
        }
    });

这样咱们就完成一个axios的请求封装

另外咱们还须要将这个文件代入到main.js里面

mian.js文件:

import https from './api/https';//地址根据你实际状况引入
Vue.use(https);

咱们看效果

先看看vue的原型上有没有咱们这两个方法

clipboard.png
有了这个咱们就能够用this.getFN 或this.postFN去根据业务去请求数据了

我这里展现个人结果

代码:

clipboard.png

结果:

clipboard.png

美滋滋,但愿对你们有所帮助

最后提供node代理配置,用于解决跨域

找到config---index.js文件

clipboard.png

代码:

const host = "https://echarts.baidu.com/examples/";
    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {
      '/': {        target: host + '',
        changeOrigin: true,
        pathRewrite: {
          '^/': ''
        } 
     }
    },

谢谢

转载请留下地址,禁止商业转载

有问题能够反馈给我 qq:652165177

GitHub地址 :个人地址

相关文章
相关标签/搜索