亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue axios基于常見業(yè)務(wù)場景的二次封裝的實現(xiàn)

 更新時間:2018年09月21日 10:35:10   作者:菠蘿油王子  
這篇文章主要介紹了vue axios基于常見業(yè)務(wù)場景的二次封裝的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

axios

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

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

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

npm:

$ npm install axios

bower:

$ bower install axios

Using cdn:

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

業(yè)務(wù)場景:

  1. 全局請求配置。
  2. get,post,put,delete等請求的promise封裝。
  3. 全局請求狀態(tài)管理,供加載動畫等使用。
  4. 路由跳轉(zhuǎn)取消當前頁面請求。
  5. 請求攜帶token,權(quán)限錯誤統(tǒng)一管理。

默認配置

定義全局的默認配置

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

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

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

優(yōu)先級:自定義配置 > 默認配置

請求及響應(yīng)攔截器

請求攔截器

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

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

響應(yīng)攔截器

axios.interceptors.response.use(function (response) {
 // 1.將當前請求中請求列表中刪除
 requestList.splice(requestList.findIndex(item => item === response.config.url), 1)
 // 2.當請求列表為空時,更改loading狀態(tài)
 if (requestList.length === 0) {
  store.dispatch('changeGlobalState', {loading: false})
 }
 // 3.統(tǒng)一處理權(quán)限認證錯誤管理
 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.處理網(wǎng)絡(luò)請求失敗
  window.ELEMENT.Message.error('網(wǎng)絡(luò)請求失敗', 1000)
 }
 return Promise.reject(error)
})

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

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.通過將執(zhí)行程序函數(shù)傳遞給CancelToken構(gòu)造函數(shù)來創(chuàng)建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.導(dǎo)出cancel token列表供全局路由守衛(wèi)使用
export {sources, post, get}

1.axios cancel token API
2.存入需要取消的請求列表導(dǎo)出給導(dǎo)航守衛(wèi)使用
3.router.js

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

request.js完整代碼:

// 引入網(wǎng)絡(luò)請求庫 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('網(wǎng)絡(luò)請求失?。?, 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}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深度解讀vue-resize的具體用法

    深度解讀vue-resize的具體用法

    這篇文章主要介紹了vue-resize深度解讀,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • vue-cli2.0轉(zhuǎn)3.0之項目搭建的詳細步驟

    vue-cli2.0轉(zhuǎn)3.0之項目搭建的詳細步驟

    這篇文章主要介紹了vue-cli2.0轉(zhuǎn)3.0之項目搭建的詳細步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • vue中計算屬性和方法的區(qū)別及說明

    vue中計算屬性和方法的區(qū)別及說明

    這篇文章主要介紹了vue中計算屬性和方法的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 一篇帶你搞懂Vue中的自定義指令

    一篇帶你搞懂Vue中的自定義指令

    自定義指令,是Vue提供的一種擴展和定制的機制,使開發(fā)者能夠在組件中直接操作DOM、處理事件、添加樣式等,并提供了與第三方庫集成的方式,定義指令使得Vue在處理交互和DOM操作時更加靈活和強大,本文將帶大家搞懂Vue中的自定義指令,需要的朋友可以參考下
    2023-07-07
  • Vue tagsview實現(xiàn)多頁簽導(dǎo)航功能流程詳解

    Vue tagsview實現(xiàn)多頁簽導(dǎo)航功能流程詳解

    基本上后臺管理系統(tǒng)都需要有多頁簽的功能,但是因為一些腳手架項目基本都把這個功能給集成好了,導(dǎo)致在學(xué)習(xí)或者修改的時候不知道該如何下手。今天這篇文章就來聊一聊,vue-element-admin項目是如何實現(xiàn)多頁簽功能的
    2022-09-09
  • vue3發(fā)送驗證碼倒計時功能的實現(xiàn)(防止連點、封裝復(fù)用)

    vue3發(fā)送驗證碼倒計時功能的實現(xiàn)(防止連點、封裝復(fù)用)

    這篇文章主要介紹了vue3發(fā)送驗證碼倒計時功能的實現(xiàn)(防止連點、封裝復(fù)用),實現(xiàn)思路是點擊發(fā)送驗證碼,驗證碼倒計時,校驗手機號是否正常等一系列操作,本文通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • vue源碼之首次渲染過程詳解

    vue源碼之首次渲染過程詳解

    這篇文章主要為大家詳細介紹了vue源碼之首次渲染過程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Vue from-validate 表單驗證的示例代碼

    Vue from-validate 表單驗證的示例代碼

    本篇文章主要介紹了Vue from-validate 表單驗證的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Vue實現(xiàn)遞歸組件的思路與示例代碼

    Vue實現(xiàn)遞歸組件的思路與示例代碼

    以簡單的樹形組件為案例,實現(xiàn)在組件中遞歸組件,下面這篇文章主要給大家介紹了關(guān)于Vue實現(xiàn)遞歸組件的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Vue使用video.js的代碼詳解

    Vue使用video.js的代碼詳解

    這篇文章主要介紹了Vue使用video.js的代碼詳解,包括在vue腳手架中引入video.js,實例化了視頻.js播放器,并在上銷毀了它,結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-03-03

最新評論