基于vue配置axios的方法步骤


Posted in Javascript onNovember 09, 2017

axios 简介

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:

  1. 从浏览器中创建 XMLHttpRequest
  2. 从 node.js 发出 http 请求
  3. 支持 Promise API
  4. 拦截请求和响应
  5. 转换请求和响应数据
  6. 取消请求
  7. 自动转换JSON数据
  8. 客户端支持防止 CSRF/XSRF

1、背景

  1. 在项目开发中ajax请求是必不可缺少
  2. 一部分ajax请求不需要loading或则请求时间少于多少是不显示loading
  3. 项目中对请求的同一化处理(错误处理,返回数据格式化处理,loading处理,token处理)
  4. 配置基于个人vue项目进行配置,已加载vux相关组件,会进行一些依赖的import(可以按需配置)
import Vue from 'vue'
import axios from 'axios'
//项目的一些环境配置参数,读取host
import config from '@/config'
//vuex状态管理,这里主要进行对全局loading的控制
import store from '@/store'
//vue-router对相应状态码的页面操作(router实例)
import router from '@/router'
//console对应封装
import { log } from '@/utils'

2、解决方案

对于axios的封装中我们定义几个参数进行申明

// 加载最小时间
const MINI_TIME = 300
// 超时时间(超时时间)
let TIME_OUT_MAX = 5000
// 环境value
let _env = process.env.NODE_ENV
// 请求接口host
let _apiHost = config.api
// 请求组(判断当前请求数)
let _requests = []

一般一个项目中的根host和Content-Type都是统一的,这里对axios进行统一的配置(如果这个后端需要formData格式的表单即content-type='application/x-www-form-urlencoded;charset=utf-8'数据,需要对请求数据进行表单序列化,比较快的方式就是引入qs库qs.stringify进行处理后传输)

axios.defaults.headers.common['Content-Type'] = 'application/json'
axios.defaults.baseURL = _apiHost

一般情况下项目中同一时刻都会有不止一个请求在进行(还没有返回),要判断当前是否还存在进行中的ajax,就需要对_requests这个数组进行维护;

/**
 * 添加请求,显示loading
 * @param {请求配置} config 
 */
function pushRequest(config) {
 log(`${config.url}--begin`)
 _requests.push(config)
 Vue.$vux.loading.show({
  text: 'Loading'
 })
 store.dispatch('loading')
}

/**
 * 移除请求,无请求时关闭loading
 * @param {请求配置} config 
 */
function popRequest(config) {
 log(`${config.url}--end`)
 let _index = _requests.findIndex(r => {
  return r === config
 })
 if (_index > -1) {
  _requests.splice(_index, 1)
 }
 if (!_requests.length) {
  Vue.$vux.loading.hide(0)
  store.dispatch('loading', false)
 }
}

接下来对axios基于上面的准备进行处理

/**
 * 请求地址,请求数据,是否静默,请求方法
 */
export default (url, data = {}, isSilence = false, method = 'POST') => {
 let _opts = { method, url }
 //通用数据的合并(token)
 let _data = Object.assign({}, data, { token: store.getters.token })
 const _query = {}
 for (let _key in _data) {
  if (_data.hasOwnProperty(_key) && _data[_key] !== '') {
   _query[_key] = _data[_key]
  }
 }
 //axios实例请求定时器ID
 let _timer = null
 //判断请求类型
 if (method.toLocaleUpperCase() === 'POST') {
  _opts.data = _query
 } else {
  _opts.params = _query
 }
 //返回一个promise
 return new Promise((resolve, reject) => {
  //实例化axios
  const _instance = axios.create({
   timeout: TIME_OUT_MAX
  })
  //定义请求的唯一标识
  let _random = { stamp: Date.now(), url: `${_apiHost + url}` }
  //判断是否静默(静默的话就不加入请求标识队列,不是则申明此请求实例的定时器)
  if (!isSilence) {
   _timer = setTimeout(() => {
    pushRequest(_random)
   }, MINI_TIME)
  }
  //axios实例发送当前请求
  //请求完成:1、取消当前请求的定时器;2、在当前请求标识队列中移除当前标识;

3、成功的话返回统一处理后的数据,失败则对状态码进行判断

_instance(_opts)
   .then(res => {
    let responseData = res.data
    clearTimeout(_timer)
    popRequest(_random)
    resolve(res.data)
   })
   .catch(res => {
    let _response = res.response
    let _message = null
    clearTimeout(_timer)
    popRequest(_random)
    switch (_response.status) {
     case 404:
      _message = '404,错误请求'
      break
     case 401:
      router.push({ path: '/login', query: { redirect: router.currentRoute.fullPath } })
      _message = '未授权'
      break
     case 403:
      _message = '禁止访问'
      break
     case 408:
      _message = '请求超时'
      break
     case 500:
      _message = '服务器内部错误'
      break
     case 501:
      _message = '功能未实现'
      break
     case 503:
      _message = '服务不可用'
      break
     case 504:
      _message = '网关错误'
      break
     default:
      _message = '未知错误'
    }
    if (!isSilence) {
     Vue.$vux.toast.show({
      text: _response.data && _response.data.error ? _response.data.error : _message,
      type: 'warn',
      width: '10em'
     })
    }
    reject(res)
   })
 })
}

github地址:https://github.com/NoManReady/Tide/blob/master/src/utils/fetch.js

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery.ui.progressbar 中文文档
Nov 26 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
Jan 25 Javascript
DWZ刷新dialog解决方法
Mar 03 Javascript
JavaScript数据结构和算法之图和图算法
Feb 11 Javascript
AngularJs concepts详解及示例代码
Sep 01 Javascript
javascript实现文字无缝滚动
Dec 27 Javascript
基于react框架使用的一些细节要点的思考
May 31 Javascript
ES6扩展运算符用法实例分析
Oct 31 Javascript
详解如何探测小程序返回到webview页面
May 14 Javascript
JS加载解析Markdown文档过程详解
May 19 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
May 26 Javascript
JS检测浏览器开发者工具是否打开的方法详解
Oct 02 Javascript
微信小程序倒计时功能实现代码
Nov 09 #Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
Nov 09 #jQuery
微信小程序获取手机号授权用户登录功能
Nov 09 #Javascript
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 #jQuery
webpack中CommonsChunkPlugin详细教程(小结)
Nov 09 #Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
Nov 09 #Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 #Javascript
You might like
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
php实现zip文件解压操作
2015/11/03 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
浅析tr的隐藏和显示问题
2014/03/05 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
2018/04/18 jQuery
微信小程序实现搜索功能
2020/03/10 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
numpy.where() 用法详解
2019/05/27 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
淘宝客服自我总结鉴定
2014/01/25 职场文书
化妆品活动策划方案
2014/05/23 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书