中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue如何實現axios二次封裝

發布時間:2022-11-21 09:37:17 來源:億速云 閱讀:152 作者:iii 欄目:開發技術

這篇文章主要介紹“vue如何實現axios二次封裝”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“vue如何實現axios二次封裝”文章能幫助大家解決問題。

axios

axios 是一個基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。

在前端框架中的應用也是特別廣泛,不管是vue還是react,都有很多項目用axios作為網絡請求庫。

我在最近的幾個項目中都有使用axios,并基于axios根據常見的業務場景封裝了一個通用的request服務。

npm:

$ npm install axios

bower:

$ bower install axios

Using cdn:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

業務場景:

  1. 全局請求配置。

  2. get,post,put,delete等請求的promise封裝。

  3. 全局請求狀態管理,供加載動畫等使用。

  4. 路由跳轉取消當前頁面請求。

  5. 請求攜帶token,權限錯誤統一管理。

默認配置

定義全局的默認配置

axios.defaults.timeout = 10000 //超時取消請求
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'
axios.defaults.baseURL = process.env.BASE_URL

自定義配置(非常見業務場景,僅作介紹)

// 創建實例時設置配置的默認值
var instance = axios.create({
 baseURL: 'https://api.another.com'
});
// 在實例已創建后修改默認值
instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

優先級:自定義配置 > 默認配置

請求及響應攔截器

請求攔截器

// 請求列表
const requestList = []
axios.interceptors.request.use((config) => {
 //1.將當前請求的URL添加進請求列表數組
 requestList.push(config.url)
 //2.請求開始,改變loading狀態供加載動畫使用
 store.dispatch('changeGlobalState', {loading: true})
 //3.從store中獲取token并添加到請求頭供后端作權限校驗
 const token = store.getters.userInfo.token
 if (token) {
  config.headers.token = token
 }
 return config
}, function (error) {
 return Promise.reject(error)
})

1.請求攔截器中將所有請求的url添加進請求列表變量,為取消請求及loading狀態管理做準備
2.請求一旦開始,就可以開啟動畫加載效果。
3.用戶登錄后可以在請求頭中攜帶token做權限校驗使用。

響應攔截器

axios.interceptors.response.use(function (response) {
 // 1.將當前請求中請求列表中刪除
 requestList.splice(requestList.findIndex(item => item === response.config.url), 1)
 // 2.當請求列表為空時,更改loading狀態
 if (requestList.length === 0) {
  store.dispatch('changeGlobalState', {loading: false})
 }
 // 3.統一處理權限認證錯誤管理
 if (response.data.code === 900401) {
  window.ELEMENT.Message.error('認證失效,請重新登錄!', 1000)
  router.push('/login')
 }
 return response
}, function (error) {
 // 4.處理取消請求
 if (axios.isCancel(error)) {
  requestList.length = 0
  store.dispatch('changeGlobalState', {loading: false})
  throw new axios.Cancel('cancel request')
 } else {
  // 5.處理網絡請求失敗
  window.ELEMENT.Message.error('網絡請求失敗', 1000)
 }
 return Promise.reject(error)
})

1.響應返回后將相應的請求從請求列表中刪除
2.當請求列表為空時,即所有請求結束,加載動畫結束
3.權限認證報錯統一攔截處理
4.取消請求的處理需要結合其他代碼說明
5.由于項目后端并沒有采用RESTful風格的接口請求,200以外都歸為網絡請求失敗

promise封裝及取消請求

const CancelToken = axios.CancelToken
//cancel token列表
let sources = []
const request = function (url, params, config, method) {
 return new Promise((resolve, reject) => {
  axios[method](url, params, Object.assign({}, config, {
  //1.通過將執行程序函數傳遞給CancelToken構造函數來創建cancel token
   cancelToken: new CancelToken(function executor (c) {
   //2.將cancel token存入列表
    sources.push(c)
   })
  })).then(response => {
   resolve(response.data)
  }, err => {
   if (err.Cancel) {
    console.log(err)
   } else {
    reject(err)
   }
  }).catch(err => {
   reject(err)
  })
 })
}

const post = (url, params, config = {}) => {
 return request(url, params, config, 'post')
}

const get = (url, params, config = {}) => {
 return request(url, params, config, 'get')
}
//3.導出cancel token列表供全局路由守衛使用
export {sources, post, get}

1.axios cancel token API
2.存入需要取消的請求列表導出給導航守衛使用
3.router.js

...
import { sources } from '../service/request'
...
router.beforeEach((to, from, next) => {
 document.title = to.meta.title || to.name
  //路由發生變化時取消當前頁面網絡請求
 sources.forEach(item => {
  item()
 })
 sources.length = 0
 next()
})

request.js完整代碼:

// 引入網絡請求庫 https://github.com/axios/axios

import axios from 'axios'
import store from '../store'
import router from '../router'

// axios.defaults.timeout = 10000
const requestList = []

axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'

axios.defaults.baseURL = process.env.BASE_URL
// 自定義攔截器
axios.interceptors.request.use((config) => {
 requestList.push(config.url)
 store.dispatch('changeGlobalState', {loading: true})
 const token = store.getters.userInfo.token
 if (token) {
  config.headers.token = token
 }
 return config
}, function (error) {
 return Promise.reject(error)
})

axios.interceptors.response.use(function (response) {
 requestList.splice(requestList.findIndex(item => item === response.config.url), 1)
 if (requestList.length === 0) {
  store.dispatch('changeGlobalState', {loading: false})
 }
 if (response.data.code === 900401) {
  window.$toast.error('認證失效,請重新登錄!', 1000)
  router.push('/login')
 }
 return response
}, function (error) {
 requestList.length = 0
 store.dispatch('changeGlobalState', {loading: false})
 if (axios.isCancel(error)) {
  throw new axios.Cancel('cancel request')
 } else {
  window.$toast.error('網絡請求失敗!', 1000)
 }
 return Promise.reject(error)
})

const CancelToken = axios.CancelToken
let sources = []

const request = function (url, params, config, method) {
 return new Promise((resolve, reject) => {
  axios[method](url, params, Object.assign(config, {
   cancelToken: new CancelToken(function executor (c) {
    sources.push(c)
   })
  })).then(response => {
   resolve(response.data)
  }, err => {
   reject(err)
  }).catch(err => {
   reject(err)
  })
 })
}

const post = (url, params, config = {}) => {
 return request(url, params, config, 'post')
}

const get = (url, params, config = {}) => {
 return request(url, params, config, 'get')
}

export {sources, post, get}

為什么要使用Vue

Vue是一款友好的、多用途且高性能的JavaScript框架,使用vue可以創建可維護性和可測試性更強的代碼庫,Vue允許可以將一個網頁分割成可復用的組件,每個組件都包含屬于自己的HTML、CSS、JavaScript,以用來渲染網頁中相應的地方,所以越來越多的前端開發者使用vue。

關于“vue如何實現axios二次封裝”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉树县| 岑溪市| 陈巴尔虎旗| 揭西县| 汉沽区| 玉环县| 大同县| 司法| 翁牛特旗| 宝坻区| 垫江县| 铅山县| 姜堰市| 阿合奇县| 太原市| 泾阳县| 东阳市| 海晏县| 灵丘县| 巴东县| 嘉义县| 桐城市| 潢川县| 富平县| 喀喇| 黑山县| 慈溪市| 平邑县| 荔浦县| 佛山市| 龙山县| 伊川县| 白城市| 清丰县| 安徽省| 平湖市| 威宁| 海晏县| 达州市| 七台河市| 财经|