隨著 vuejs 作者尤雨溪發布消息,不再繼續維護vue-resource,並推薦大家使用 axios 開始,axios 被越來越多的人所了解。本文主要介紹了基於vue配置axios的方法步驟,小編覺得挺不錯的,現在分享給大家,也給大家做個參考,希望能幫助到大家。
axios 簡介
axios 是基於Promise 用於瀏覽器和nodejs 的HTTP 用戶端,它本身俱有以下特徵:
#從瀏覽器建立XMLHttpRequest
從node.js 發出http 請求
支援Promise API
#攔截請求和回應
轉換請求和回應資料
取消請求
自動轉換JSON資料
客戶端支援防止CSRF/XSRF
1、背景
在專案開發中ajax請求是必不可缺少
#一部分ajax請求不需要loading或則請求時間少於多少是不顯示loading
專案中對請求的同一化處理(錯誤處理,返回資料格式化處理,loading處理,token處理)
配置基於個人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) }) }) }相關推薦:
vue全分析--Vue+Vue-router+Vuex+axios
以上是vue設定axios的方法步驟範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!