基于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更换文章内容与改变字体大小代码
Sep 30 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
Jun 26 Javascript
JS 实现列表与多选框选择附预览动画
Oct 29 Javascript
移动端JQ插件hammer使用详解
Jul 03 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
Jun 09 Javascript
javascript函数的四种调用模式
Jan 08 Javascript
Bootstrap表单简单实现代码
Mar 06 Javascript
jQuery树插件zTree使用方法详解
May 02 jQuery
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
Jun 30 Javascript
js使用formData实现批量上传
Mar 27 Javascript
JavaScript实现五子棋游戏的方法详解
Jul 08 Javascript
Threejs实现滴滴官网首页地球动画功能
Jul 13 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 彩色文字实现代码
2009/06/29 PHP
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
python 从远程服务器下载日志文件的程序
2013/02/10 Python
python支持断点续传的多线程下载示例
2014/01/16 Python
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
python爬取NUS-WIDE数据库图片
2016/10/05 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
PyTorch学习笔记之回归实战
2018/05/28 Python
Python2与Python3的区别实例总结
2019/04/17 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
python time.strptime格式化实例详解
2021/02/03 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
我的网上商城创业计划书
2013/12/26 职场文书
学生安全教育材料
2014/02/14 职场文书
军训教官感言
2014/03/02 职场文书
人力资源总监工作说明
2014/03/03 职场文书
机关会计岗位职责
2014/04/08 职场文书
水电工程师岗位职责
2015/02/13 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python