基于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 相关文章推荐
js资料prototype 属性
Mar 13 Javascript
TreeView 用法(有代码)(asp.net)
Jul 15 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
Sep 06 Javascript
js计算两个时间之间天数差的实例代码
Nov 19 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
Jul 10 Javascript
Bootstrap每天必学之轮播(Carousel)插件
Apr 25 Javascript
BootStrap中Tab页签切换实例代码
May 30 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
Aug 02 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
Mar 09 Javascript
基于js中this和event 的区别(详解)
Oct 24 Javascript
详解关于element级联选择器数据回显问题
Feb 20 Javascript
微信小程序实现上传多个文件 超过10个
Mar 30 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 广告调用类代码(支持Flash调用)
2011/08/11 PHP
使用URL传输SESSION信息
2015/07/14 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
提升Python程序运行效率的6个方法
2015/03/31 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
会计毕业自我鉴定
2014/02/05 职场文书
篝火晚会主持词
2014/03/25 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
如何获取numpy array前N个最大值
2021/05/14 Python
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
工厂无线对讲系统解决方案
2022/02/18 无线电
分享7个 Python 实战项目练习
2022/03/03 Python
PYTHON InceptionV3模型的复现详解
2022/05/06 Python