Home  >  Article  >  Web Front-end  >  Example of steps for configuring axios in vue

Example of steps for configuring axios in vue

小云云
小云云Original
2018-05-14 16:40:315271browse

With the announcement by You Yuxi, the author of vuejs, that he will no longer continue to maintain vue-resource, and recommends everyone to use axios to start, axios is known to more and more people. This article mainly introduces the steps of configuring Axios based on Vue. The editor thinks it is quite good. Now I will share it with you and give you a reference. I hope it can help everyone.

axios Introduction

axios is a Promise-based HTTP client for browsers and nodejs. It has the following characteristics:

  1. Create XMLHttpRequest from the browser

  2. Issue an http request from node.js

  3. Support Promise API

  4. Interception of requests and responses

  5. Convert request and response data

  6. Cancel request

  7. Automatically convert JSON data

  8. Client supports preventing CSRF/XSRF

1. Background

  1. Ajax requests are indispensable in project development

  2. Some ajax requests do not require loading or if the request time is less than a certain amount, loading will not be displayed

  3. Uniform processing of requests in the project (error processing, return data formatting processing, loading processing, token processing)

  4. Configuration is based on personal vue The project is configured, vux-related components have been loaded, and some dependent imports will be made (can be configured as needed)

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. Solution

For the axios encapsulation, we define several parameters to declare

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

Generally, the root host and Content-Type in a project are unified. Here, axios is configured uniformly (if this backend requires formData The form in the format is content-type='application/x-www-form-urlencoded;charset=utf-8' data. The request data needs to be serialized in the form. The faster way is to introduce the qs library qs.stringify for processing. Transmission)

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

Generally, there will be more than one request in progress at the same time in the project (not yet returned). To determine whether there is still ongoing ajax, you need to maintain the _requests array;

/**
 * 添加请求,显示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)
 }
}

Next, axios will be processed based on the above preparation

/**
 * 请求地址,请求数据,是否静默,请求方法
 */
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. If successful, the unified processed data will be returned. If failed, the status code will be judged

  _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)
   })
 })
}

Related recommendations:

About VueJs to build Axios interface request tool analysis

A brief introduction to the get and post methods in axios

vue full analysis--Vue+Vue-router+Vuex+axios

The above is the detailed content of Example of steps for configuring axios in vue. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn