1. 程式人生 > 實用技巧 >vue中axios的二次封裝例項講解

vue中axios的二次封裝例項講解

我們做專案時,雖然axios也可以直接拿來用,但是對介面比較零散,不太好進行維護,也會產生大量的重複程式碼,所以我在這對axios進行了統一介面處理

第一步,先在src中的公共資料夾中如utils裡新建request.js檔案

import axios from 'axios'
import router from '@/router/routers'
import { Notification, MessageBox } from 'element-ui'
import store from '../store'
import { getToken } from '@/utils/auth'
import Config from '@/config'
 
import {baseUrl} from '@/utils/env'
 
// 建立axios例項
const service = axios.create({
 baseURL: baseUrl, // api 的 base_url
 // baseURL: process.env.BASE_API, // api 的 base_url
 timeout: Config.timeout // 請求超時時間
})
 
// request攔截器
service.interceptors.request.use(
 config => {
  if (getToken()) {
   config.headers['Authorization'] = 'Bearer ' + getToken() // 讓每個請求攜帶自定義token 請根據實際情況自行修改
  }
  config.headers['Content-Type'] = 'application/json'
  return config
 },
 error => {
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
 }
)
 
// response 攔截器
service.interceptors.response.use(
 response => {
  const code = response.status
  console.log(response)
  if (code < 200 || code > 300) {
   Notification.error({
    title: response.message
   })
   return Promise.reject('error')
  } else {
   return response.data
  }
 },
 error => {
  let code = 0
  try {
   code = error.response.data.status
  } catch (e) {
   if (error.toString().indexOf('Error: timeout') !== -1) {
    Notification.error({
     title: '網路請求超時',
     duration: 2500
    })
    return Promise.reject(error)
   }
   if (error.toString().indexOf('Error: Network Error') !== -1) {
    Notification.error({
     title: '網路請求錯誤',
     duration: 2500
    })
    return Promise.reject(error)
   }
  }
  if (code === 401) {
   MessageBox.confirm(
    '登入狀態已過期,您可以繼續留在該頁面,或者重新登入',
    '系統提示',
    {
     confirmButtonText: '重新登入',
     cancelButtonText: '取消',
     type: 'warning'
    }
   ).then(() => {
    store.dispatch('LogOut').then(() => {
     location.reload() // 為了重新例項化vue-router物件 避免bug
    })
   })
  } else if (code === 403) {
   router.push({ path: '/401' })
  } else {
   const errorMsg = error.response.data.message
   if (errorMsg !== undefined) {
    Notification.error({
     title: errorMsg,
     duration: 2500
    })
   }
  }
  return Promise.reject(error)
 }
)
export default service

程式碼解讀:

將介面統一放到單獨的檔案中如我的

引入request.js

第三步,

在頁面使用

好了,這就是axios的二次封裝

以上就是關於vue中axios的二次封裝的全部知識點內容,感謝大家的學習和對碼農教程的支援。