Maison >interface Web >js tutoriel >Exemple d'étapes pour configurer axios dans vue

Exemple d'étapes pour configurer axios dans vue

小云云
小云云original
2018-05-14 16:40:315278parcourir

Comme l'auteur de vuejs You Yuxi a annoncé qu'il ne maintiendrait plus vue-resource et recommande à tout le monde d'utiliser axios pour commencer, axios est connu de plus en plus de personnes. Cet article présente principalement les étapes de configuration d'Axios basé sur Vue. L'éditeur pense que c'est plutôt bien. Maintenant, je vais le partager avec vous et vous donner une référence, j'espère que cela pourra aider tout le monde.

Introduction à axios

axios est un client HTTP basé sur Promise pour les navigateurs et nodejs. Il présente les caractéristiques suivantes :

  1. <.>Créer XMLHttpRequest à partir du navigateur

  2. Faire une requête http à partir de node.js

  3. API de promesse de support

  4. Intercepter les demandes et les réponses

  5. Convertir les données de demande et de réponse

  6. Annuler la demande

  7. Convertir automatiquement les données JSON

  8. Le client prend en charge la prévention CSRF/XSRF

Arrière-plan

  1. Les requêtes Ajax sont indispensables dans le développement de projets

  2. Certaines requêtes ajax ne nécessitent pas de chargement ou si le temps de requête est inférieur à un certain montant, le chargement ne sera pas affiché

  3. Traitement uniforme des requêtes dans le projet (gestion des erreurs, traitement du formatage des données de retour, traitement du chargement, traitement des jetons)

  4. Configuration basée sur la vue personnelle Le projet est configuré, les composants liés à vux ont été chargés et certaines importations dépendantes seront effectuées (peuvent être configurées selon les besoins)

import Vue from &#39;vue&#39;
import axios from &#39;axios&#39;
//项目的一些环境配置参数,读取host
import config from &#39;@/config&#39;
//vuex状态管理,这里主要进行对全局loading的控制
import store from &#39;@/store&#39;
//vue-router对相应状态码的页面操作(router实例)
import router from &#39;@/router&#39;
//console对应封装
import { log } from &#39;@/utils&#39;

Solution 2.

Nous définissons plusieurs paramètres pour la déclaration dans le package axios

// 加载最小时间
const MINI_TIME = 300
// 超时时间(超时时间)
let TIME_OUT_MAX = 5000
// 环境value
let _env = process.env.NODE_ENV
// 请求接口host
let _apiHost = config.api
// 请求组(判断当前请求数)
let _requests = []
Généralement, l'hôte racine et le Content-Type dans un projet sont unifiés, et axios est configuré uniformément ici (si ce le backend nécessite des données de formulaire au format formData, c'est-à-dire des données content-type='application/x-www-form-urlencoded;charset=utf-8'. Les données de la demande doivent être sérialisées. qs bibliothèque qs. Stringify est traité et transmis)

axios.defaults.headers.common[&#39;Content-Type&#39;] = &#39;application/json&#39;
axios.defaults.baseURL = _apiHost
Généralement, il y aura plus d'une requête en cours en même temps dans le projet (pas encore renvoyée Pour déterminer si elle est toujours en cours). ajax, vous devez _ Le tableau des requêtes est maintenu

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

/**
 * 移除请求,无请求时关闭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(&#39;loading&#39;, false)
 }
}
Ensuite, axios est traité sur la base des préparations ci-dessus

/**
 * 请求地址,请求数据,是否静默,请求方法
 */
export default (url, data = {}, isSilence = false, method = &#39;POST&#39;) => {
 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] !== &#39;&#39;) {
   _query[_key] = _data[_key]
  }
 }
 //axios实例请求定时器ID
 let _timer = null
 //判断请求类型
 if (method.toLocaleUpperCase() === &#39;POST&#39;) {
  _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. les données traitées seront renvoyées. En cas d'échec, déterminez le code d'état

  _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 = &#39;404,错误请求&#39;
      break
     case 401:
      router.push({ path: &#39;/login&#39;, query: { redirect: router.currentRoute.fullPath } })
      _message = &#39;未授权&#39;
      break
     case 403:
      _message = &#39;禁止访问&#39;
      break
     case 408:
      _message = &#39;请求超时&#39;
      break
     case 500:
      _message = &#39;服务器内部错误&#39;
      break
     case 501:
      _message = &#39;功能未实现&#39;
      break
     case 503:
      _message = &#39;服务不可用&#39;
      break
     case 504:
      _message = &#39;网关错误&#39;
      break
     default:
      _message = &#39;未知错误&#39;
    }
    if (!isSilence) {
     Vue.$vux.toast.show({
      text: _response.data && _response.data.error ? _response.data.error : _message,
      type: &#39;warn&#39;,
      width: &#39;10em&#39;
     })
    }
    reject(res)
   })
 })
}
Recommandations associées :


À propos de VueJs pour créer l'analyse de l'outil de demande d'interface Axios

Une brève introduction aux méthodes get et post dans axios

Analyse complète de Vue --Vue+Vue-router+Vuex+axios

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn