Vue2學(xué)習小記-給Vue2路由導(dǎo)航鉤子和axios攔截器做個封裝

1.寫在前面

最近在學(xué)習Vue2丸相,遇到有些頁面請求數(shù)據(jù)需要用戶登錄權(quán)限搔确、服務(wù)器響應(yīng)不符預(yù)期的問題,但是總不能每個頁面都做單獨處理吧灭忠,于是想到axios提供了攔截器這個好東西膳算,再于是就出現(xiàn)了本文。

2.具體需求

  • 用戶鑒權(quán)與重定向:使用Vue提供的路由導(dǎo)航鉤子
  • 請求數(shù)據(jù)序列化:使用axios提供的請求攔截器
  • 接口報錯信息處理:使用axios提供的響應(yīng)攔截器

3.簡單實現(xiàn)

3.1 路由導(dǎo)航鉤子層面鑒權(quán)與重定向的封裝

路由導(dǎo)航鉤子所有配置均在router/index.js弛作,這里是部分代碼

import Vue from 'vue'
import Router from 'vue-router'
import { getUserData } from '@/script/localUserData'

const MyAddress = r => require.ensure([], () => r(require('@/views/MyAddress/MyAddress')), 'MyAddress')

Vue.use(Router)

const routes = [
  {
    path: '/profile/address',
    name: 'MyAddress',
    component: MyAddress,
    meta: {
      title: '我的地址',
      requireAuth: true
    }
  },
  // 更多...
]

const router = new Router({
  mode: 'history',
  routes
})

我們主要來看下面邏輯處理部分的代碼

let indexScrollTop = 0
router.beforeEach((to, from, next) => {
  // 路由進入下一個路由對象前涕蜂,判斷是否需要登陸
  // 在路由meta對象中由個requireAuth字段,只要此字段為true缆蝉,必須做鑒權(quán)處理
  if (to.matched.some(res => res.meta.requireAuth)) {
    // userData為存儲在本地的一些用戶信息
    let userData = getUserData()
    // 未登錄和已經(jīng)登錄的處理
    // getUserData方法處理后如果userData.token沒有值就是undefined宇葱,下面直接判斷
    if (userData.token === undefined) {
      // 執(zhí)行到此處說明沒有登錄,君可按需處理之后再執(zhí)行如下方法去登錄頁面
      // 我這里沒有其他處理刊头,直接去了登錄頁面
      next({
        path: '/login',
        query: {
          redirect: to.path
        }
      })
    } else {
      // 執(zhí)行到說明本地存儲有用戶信息
      // 但是用戶信息是否過期還是需要驗證一下滴
      let overdueTime = userData.overdueTime
      let nowTime = +new Date
      // 登陸過期和未過期
      if (nowTime > overdueTime) {
        // 登錄過期的處理黍瞧,君可按需處理之后再執(zhí)行如下方法去登錄頁面
        // 我這里沒有其他處理,直接去了登錄頁面
        next({
          path: '/login',
          query: {
            redirect: to.path
          }
        })
      } else {
        next()
      }
    }
  } else {
    next()
  }
  if (to.path !== '/') {
    indexScrollTop = document.body.scrollTop
  }
  document.title = to.meta.title || document.title
})

router.afterEach(route => {
  if (route.path !== '/') {
    document.body.scrollTop = 0
  } else {
    Vue.nextTick(() => {
      document.body.scrollTop = indexScrollTop
    })
  }
})
export default router

至此原杂,路由鉤子層面的鑒權(quán)處理完畢印颤,不過細心的你可能注意到:導(dǎo)航去登錄頁面調(diào)用的next方法里面有個query對象,攜帶了目標路由的地址穿肄,這是因為在登錄成功后我們需要重定向到目標頁面年局。

3.2 對axios攔截器封裝

axios所有配置均在件script/getData.js文件际看,這里是本文件公共代碼部分

import qs from 'qs'
import { getUserData } from '@/script/localUserData'
import router from '@/router'
import axios from 'axios'
import { AJAX_URL } from '@/config/index'
axios.defaults.baseURL = AJAX_URL

axios請求攔截器代碼

/**
* 請求攔截器,請求發(fā)送之前做些事情
*/
axios.interceptors.request.use(
 config => {
   // POST || PUT || DELETE請求時先格式化data數(shù)據(jù)
   // 這里需要引入第三方模塊qs
   if (
     config.method.toLocaleUpperCase() === 'POST' ||
     config.method.toLocaleUpperCase() === 'PUT' ||
     config.method.toLocaleUpperCase() === 'DELETE'
   ) {
     config.data = qs.stringify(config.data)
   }
   // 配置Authorization參數(shù)攜帶用戶token
   let userData = getUserData()
   if (userData.token) {
     config.headers.Authorization = userData.token
   }
   return config
 },
 error => {
   // 此處應(yīng)為彈窗顯示具體錯誤信息矢否,因為是練手項目仲闽,劣者省略此處
   // 君可自行寫 || 引入第三方UI框架
   console.error(error)
   return Promise.reject(error)
 }
)

axios響應(yīng)攔截器代碼

/**
 * 響應(yīng)攔截器,請求返回異常統(tǒng)一處理
 */
axios.interceptors.response.use(
  response => {
    // 這段代碼很多場景下沒用
    if (response.data && response.data.success === false) {
      // 根據(jù)實際情況的一些處理邏輯...
      return Promise.reject(response)
    }
    return response
  },
  error => {
    // 此處報錯可能因素比較多
    // 1.需要授權(quán)處用戶還未登錄僵朗,因為路由段有驗證是否登陸赖欣,此處理論上不會出現(xiàn)
    // 2.需要授權(quán)處用戶登登錄過期
    // 3.請求錯誤 4xx
    // 5.服務(wù)器錯誤 5xx
    // 關(guān)于鑒權(quán)失敗,與后端約定狀態(tài)碼為500
    switch (error.response.status) {
      case 403:
        // 一些處理...
        break
      case 404:
        // 一些處理...
        break
      case 500:
        let userData = getUserData()
        if (userData.token === undefined) {
          // 此處為未登錄處理
          // 一些處理之后...再去登錄頁面...
          // router.push({
          //   path: '/login'
          // })
        } else {
          let overdueTime = userData.overdueTime
          let nowTime = +new Date
          if (overdueTime && nowTime > overdueTime) {
            // 此處登錄過期的處理
            // 一些處理之后...再去登錄頁面...
            // router.push({
            //   path: '/login'
            // })
          } else {
            // 極端情況验庙,登錄未過期顶吮,但是不知道哪兒錯了
            // 按需處理吧...我暴力回到了首頁
            router.push({
              path: '/'
            })
          }
        }
        break
      case 501:
        // 一些處理...
        break
      default:
        // 狀態(tài)碼辣么多,按需配置...
        break
    }
    return Promise.reject(error)
  }
)

想了解更多關(guān)于axios的信息粪薛?請移步這里悴了。

這個封裝很簡單,面對復(fù)雜的業(yè)務(wù)肯定還需要更多的考量违寿,但是對于一般的小項目或邊緣業(yè)務(wù)也差不多夠用了湃交。最后希望這篇文章能對有需要的同學(xué)提供一些幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末藤巢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菌瘪,更是在濱河造成了極大的恐慌俏扩,老刑警劉巖弊添,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油坝,死亡現(xiàn)場離奇詭異,居然都是意外死亡彬檀,警方通過查閱死者的電腦和手機瞬女,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坤学,“玉大人,你說我怎么就攤上這事深浮。” “怎么了菌瘫?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵突梦,是天一觀的道長羽利。 經(jīng)常有香客問我,道長这弧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任皇帮,我火速辦了婚禮属拾,結(jié)果婚禮上冷溶,老公的妹妹穿的比我還像新娘。我一直安慰自己纯衍,他們只是感情好苗胀,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歌亲,像睡著了一般堡掏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹅龄,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天扮休,我揣著相機與錄音,去河邊找鬼玷坠。 笑死,一個胖子當著我的面吹牛樟凄,可吹牛的內(nèi)容都是我干的兄渺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叔壤,長吁一口氣:“原來是場噩夢啊……” “哼口叙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起俺亮,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铅辞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后萨醒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苇倡,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡旨椒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年综慎,在試婚紗的時候發(fā)現(xiàn)自己被綠了涣仿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片好港。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡钧汹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拔莱,到底是詐尸還是另有隱情,我是刑警寧澤塘秦,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布尊剔,位于F島的核電站,受9級特大地震影響笔咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霹期,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一历造、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侣监,春花似錦臣淤、人聲如沸橄霉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卿堂。三九已至懒棉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間策严,已是汗流浹背挟裂。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栗竖,地道東北人渠啤。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像份名,于是被迫代替她去往敵國和親妓美。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • vue-login-intercept 一個 Vue.js 的小demo 介紹 項目地址辰如,有喜歡的歡迎 star ...
    無亦情閱讀 12,042評論 4 21
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理琉兜,服務(wù)發(fā)現(xiàn)毙玻,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • 我是真的服了 六一兒童節(jié)快樂 果然是老的的人上天不會眷顧了 分手快樂
    嘿37度閱讀 107評論 0 0
  • 如果你對自己不滿的話 1 現(xiàn)實情況是是這樣的: ▎大多數(shù)人對自己的現(xiàn)狀是不滿的。 ▎大多數(shù)人對美好生活的向往異常強...
    雜食的明子閱讀 206評論 0 2