美文网首页
vue封装axios

vue封装axios

作者: 圆滚滚1991 | 来源:发表于2018-09-22 15:19 被阅读0次

    最近在学习ES6,正好项目用到vue,axios封装请求,写的不好,欢迎大神指教。

    环境安装

    vue官网
    vue-cli的文档
    axios中文文档
    vue init webpack vue-axios
    cd vue-axios
    yarn start
    yarn add axios


    封装axios请求

    新建http.js

    import axios from 'axios';
    import qs from 'qs';
    
    //跨域请求
    axios.defaults.withCredentials = true
    
    const httpServer = (opts, data) => {
      let httpDefaultOpts = {
        method: opts.method,
        url: opts.url,
        timeout: 3000,
        data: JSON.stringify(data),
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'X-Requested-With': 'XMLHttpRequest',
        }
      }
    
      let promise = new Promise((resolve,reject)=>{
        axios(httpDefaultOpts).then(
            res=>{
                resolve(res)
            }
            ).catch(error=>{
                reject(error)
            })
      })
    
      return promise;
    }
    export default httpServer
    

    有关promise参考es6-promise
    测试连接http

    import http from '../util/http.js'
    export default {
      name: 'HelloWorld',
      data () {
        return {
          msg: 'Welcome to Your Vue.js App'
        }
      },
      methods:{
        test(){
          let opt={
            method:'get',
            url:'www.baidu.com'
          }
         let  data={
            userCode:"fff"
          }
          http(opt,data).then(res=>{
            console.log(res);
          }).catch(err=>{
            console.log(err);
          })
        }
      }
    }
    

    简单的请求封装已经完成,接下来继续优化

    1优化get post请求
     let Public = { //公共参数
           xxxx:''
        }
      data = Object.assign(Public,data);
      let httpDefaultOpts = { //http默认配置
            method: opts.method,
            url: opts.url,
            showLoading: opts.showLoading,
            timeout: 3000,
            data: JSON.stringify(data),
            params: data,
            headers: opts.method == 'get' ? {
                'Content-Type': 'application/x-www-form-urlencoded',
                'X-Requested-With': 'XMLHttpRequest',
            } : {
                "Accept": "application/json",
                'X-Requested-With': 'XMLHttpRequest',
                "Content-Type": "application/json; charset=UTF-8"
            }
        };
        if (opts.method == 'get') {
            delete httpDefaultOpts.data;
        } else {
            delete httpDefaultOpts.params;
        }
    
    2请求成功或错误判断

    如果请求成功

    function successState(res) {
        if (res.data.returnCode != "0") {
            Message({ message: res.data.errorMessage, type: "error" });
        }
    }
    

    请求错误

    function errorState(error) {
        // 如果http状态码正常,则直接返回数据
        if (error && (error.status === 200 || error.status === 304 || error.status === 400)) {
            return response
                // 如果不需要除了data之外的数据,可以直接 return response.data
        } else {
            Message({
                message: '网络连接超时,请检查网络',
                type: 'error'
            });
    return error;
        }
    }
    

    在promise 中调用

    let promise = new Promise((resolve, reject) => {
        axios(httpDefaultOpts).then(
          res => {
            successState(res)
            resolve(res)
          }
        ).catch(error => {
          errorState(error)
          reject(error)
        })
      })
    
    引入element-ui

    yarn add element-ui
    添加loading服务

    function endLoading() {
        loading.close()
    }
    let needLoadingRequestCount = 0
    
    export function showFullScreenLoading() {
        if (needLoadingRequestCount === 0) {
            startLoading()
        }
        needLoadingRequestCount++
    }
    
    export function tryHideFullScreenLoading() {
        if (needLoadingRequestCount <= 0) return
        needLoadingRequestCount--
        if (needLoadingRequestCount === 0) {
            endLoading()
        }
    }
    
    axios请求添加拦截器 以及添加loading
    axios.interceptors.request.use(config => {
        if (config.showLoading != false) {
            showFullScreenLoading()
        }
    
        return config
    }, error => {
        return Promise.reject(error)
    })
    
    axios.interceptors.response.use(response => {
        tryHideFullScreenLoading()
        return response
    }, error => {
        tryHideFullScreenLoading()
        return Promise.reject(error)
    })
    

    至此 大功告成,持续改进更新中
    https://github.com/zdyang1991/vue-axios.git

    相关文章

      网友评论

          本文标题:vue封装axios

          本文链接:https://www.haomeiwen.com/subject/ocwtoftx.html