Vue接口封裝的完整步驟記錄

首先根據接口寫好對應頁面的請求

內容如圖盡量保證js文件名稱與頁面文件名稱相同(易於查找)

根據文件目錄動態引入/導出接口

提高便捷性

/**
 * 自動引入當前文件夾下所有module
 * require.context(directory, useSubdirectories = false, regExp = /^.//);
 * @param {String} directory 讀取文件的路徑
 * @param {Boolean} directory 匹配文件的正則表達式
 * @param {regExp} regExp 讀取文件的路徑
 */
 const modulesFiles = require.context(
    './', // 在當前目錄下查找
    false, // 不遍歷子文件夾
    /\.js$/ // 正則匹配 以 .js結尾的文件
)
 const modules = modulesFiles.keys().reduce((modules, modulePath) => {
   const moduleName = modulePath.replace(/^.\/(.*)\.js/,'$1')
   const value = modulesFiles(modulePath)
   modules[moduleName] = value.default
   return modules
   }, {})

export default modules

根據項目情況編寫攔截/插入內容

import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // 在發送請求之前做些什麼

    if (store.getters.token) {
      // let each request carry token讓每個請求攜帶令牌
      // ['X-Token'] is a custom headers key 是一個自定義標題鍵
      // please modify it according to the actual situation請根據實際情況修改
      config.headers['X-Token'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status如果您想獲取http信息,如標頭或狀態
   * Please return  response => response
  */

  /**
   * Determine the request status by custom code通過自定義代碼確定請求狀態
   * Here is just an example這裡隻是一個例子
   * You can also judge the status by HTTP Status Code您還可以通過HTTP狀態碼來判斷狀態
   */
  response => {
    const res = response.data
    // console.log(res);
    // 如果自定義代碼不是20000,則判斷為錯誤.
    if (res.code !== 200) {
      Message({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      })
      
      // 50008: 非法token; 50012: 其他客戶端已登錄; 50014: Token 已過期;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // to re-login
        MessageBox.confirm('您已註銷,可以取消以停留在此頁面,或重新登錄', '確認註銷', {
          confirmButtonText: 'Re-Login',
          cancelButtonText: 'Cancel',
          type: 'warning'
        }).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service

編寫env文件

# just a flag
ENV = 'development'

# base api
VUE_APP_BASE_API = 'http://192.168.2.44:5001/v1'

vue繼承api

import serve from './api/index'
Vue.prototype.$api = serve;

使用

getAssetsList() {
  this.$api.assets
    .getAssetsList(this.queryInfo.num, this.queryInfo.size)
    .then((res) => {
      this.assetsList = res.data.cards
      this.total = res.data.page.totalCount
    })
    .catch(() => {
      this.$message.error({
        message: "失敗",
        duration: 700,
      })
    })
},

總結

到此這篇關於Vue接口封裝的文章就介紹到這瞭,更多相關Vue接口封裝內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: