axios二次封裝

涉及點:
1、axios官方文檔(axios安裝、請求攔截器、響應攔截器、axios請求配置選項)
2、promise使用 (resolve、reject、.then、.catch
3、函數封裝,全局使用

本文封裝理念:單獨封裝一個axios模塊文件,並將其掛在至main.js中,供全局使用

步驟1:npm安裝axios至當前項目中,如下

npm install axios --save 

步驟2:新建項目目錄如下,主要涉及:
這裏寫圖片描述

                                                     ~直接上代碼~
  • config.js文件
// axios中請求配置有baseURL選項,表示請求URL公共部分。
// `baseURL` 將自動加在 `url` 前面,除非 `url` 是一個絕對 URL

export const baseURL = 'http://XXXXXXXX.com/'

  • axios.js文件
import axios from 'axios'
// 在config.js文件中統一存放一些公共常量,方便之後維護
import { baseURL } from './config.js'

// 添加請求攔截器,在發送請求之前做些什麼(**具體查看axios文檔**)--------------------------------------------
axios.interceptors.request.use(function (config) {
  // 顯示loading
  return config
}, function (error) {
  // 請求錯誤時彈框提示,或做些其他事
  return Promise.reject(error)
})

// 添加響應攔截器(**具體查看axios文檔**)----------------------------------------------------------------
axios.interceptors.response.use(function (response) {
  // 對響應數據做點什麼,允許在數據返回客戶端前,修改響應的數據
  // 如果只需要返回體中數據,則如下,如果需要全部,則 return response 即可
  return response.data
}, function (error) {
  // 對響應錯誤做點什麼
  return Promise.reject(error)
})

// 封裝數據返回失敗提示函數---------------------------------------------------------------------------
function errorState (response) {
  // 隱藏loading
  // 如果http狀態碼正常,則直接返回數據
  if (response && (response.status === 200 || response.status === 304 || response.status === 400)) {
    // 如果不需要除了data之外的數據,可以直接 return response.data
    return response
  } else {
    alert('數據獲取錯誤')
  }
}

// 封裝數據返回成功提示函數---------------------------------------------------------------------------
function successState (res) {
  // 隱藏loading
  // 統一判斷後端返回的錯誤碼(錯誤碼與後臺協商而定)
  if (res.data.code === '000000') {
    alert('success')
    return res
  }
}

// 封裝axios--------------------------------------------------------------------------------------
function apiAxios (method, url, params) {
  let httpDefault = {
    method: method,
    baseURL: baseURL,
    url: url,
    params: params,
    timeout: 10000
  }

  // 注意**Promise**使用(Promise首字母大寫)
  return new Promise((resolve, reject) => {
    axios(httpDefault)
      // 此處的.then屬於axios
      .then((res) => {
        successState(res)
        resolve(res)
      }).catch((response) => {
        errorState(response)
        reject(response)
      })
  })
}

// 輸出函數getAxios、postAxios、putAxios、delectAxios,供其他文件調用-----------------------------
export default {
  // Vue.js的插件應當有一個公開方法 install。這個方法的第一個參數是 Vue 構造器,第二個參數是一個可選的選項對象。
  install: function (Vue) {
    Vue.prototype.getAxios = (url, params) => apiAxios('get', url, params)
    Vue.prototype.postAxios = (url, params) => apiAxios('post', url, params)
    Vue.prototype.putAxios = (url, params) => apiAxios('put', url, params)
    Vue.prototype.delectAxios = (url, params) => apiAxios('delect', url, params)
  }
}

番外篇:如果不需要全局使用,輸出函數時,代碼如下(全局使用者,請忽略)

// 注:如果上述export default是如下寫法,則不需要再mian.js中引入,直接在需要使用的文件中import,並使用即可。例如用axios.get()調用get方法;
 export default {
   get: (method, url, params) => apiAxios('get', url, params),
   post: (method, url, params) => apiAxios('post', url, params)
 }

  • main.js文件
// 在main.js中引入axios.js文件,並Vue.use()使用---------------------------------------

這裏寫圖片描述


  • 在需要使用的文件中直接使用 this.axios文件中輸出的函數名(例如this.getAxios),例如:

這裏寫圖片描述


end~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章