基于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文件的小脚本
Jun 28 Javascript
Javascript 同时提交多个Web表单的方法
Feb 19 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
Jun 10 Javascript
Ajax清除浏览器js、css、图片缓存的方法
Aug 06 Javascript
jquery小火箭返回顶部代码分享
Aug 19 Javascript
JavaScript正则表达式匹配 div  style标签
Mar 15 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
Jul 09 Javascript
Angular2学习笔记之数据绑定的示例代码
Jan 03 Javascript
Vue利用History记录上一页面的数据方法实例
Nov 02 Javascript
微信小程序之onLaunch与onload异步问题详解
Mar 28 Javascript
layui table单元格事件修改值的方法
Sep 24 Javascript
vue同个按钮控制展开和折叠同个事件操作
Jul 29 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
8个出色的WordPress SEO插件收集
2011/02/26 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
jquery 年会抽奖程序
2011/12/22 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
Python生成密码库功能示例
2017/05/23 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
django-rest-framework解析请求参数过程详解
2019/07/18 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
请说出几个常用的异常类
2013/01/08 面试题
巧克力蛋糕店创业计划书
2014/01/14 职场文书
伊琍体标语
2014/06/25 职场文书
实习科室评语
2015/01/04 职场文书
金秋助学感谢信
2015/01/21 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
Nginx动静分离配置实现与说明
2022/04/07 Servers