首頁 web前端 js教程 怎樣對Vue2路由導航鉤子與axios攔截器封裝

怎樣對Vue2路由導航鉤子與axios攔截器封裝

May 25, 2018 pm 02:26 PM
vue2 導航 鉤子

這次帶給大家怎樣對Vue2路由導航鉤子與axios攔截器封裝,對Vue2路由導航鉤子與axios攔截器封裝的注意事項有哪些,下面就是實戰案例,一起來看一下。

1.寫在前面

最近在學習Vue2,遇到有些頁面請求資料需要使用者登入權限、伺服器回應不符預期的問題,但是總不能每個頁面都做單獨處理吧,於是想到axios提供了攔截器這個好東西,然後就出現了本文。

2.具體需求

  1. 使用者識別碼與重定向:使用Vue提供的路由導航鉤子

  2. 請求資料序列化:使用axios提供的請求攔截器

  3. 介面報錯資訊處理:使用axios提供的回應攔截器

##介面報錯資訊處理:使用axios提供的回應攔截器

3.簡單實作

3.1 路由導航鉤子層面鑑權與重定向的封裝

路由導航鉤子所有設定均在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,必须做鉴权处理
 if (to.matched.some(res => res.meta.requireAuth)) {
  // userData为存储在本地的一些用户信息
  let userData = getUserData()
  // 未登录和已经登录的处理
  // getUserData方法处理后如果userData.token没有值就是undefined,下面直接判断
  if (userData.token === undefined) {
   // 执行到此处说明没有登录,君可按需处理之后再执行如下方法去登录页面
   // 我这里没有其他处理,直接去了登录页面
   next({
    path: '/login',
    query: {
     redirect: to.path
    }
   })
  } else {
   // 执行到说明本地存储有用户信息
   // 但是用户信息是否过期还是需要验证一下滴
   let overdueTime = userData.overdueTime
   let nowTime = +new Date
   // 登陆过期和未过期
   if (nowTime > overdueTime) {
    // 登录过期的处理,君可按需处理之后再执行如下方法去登录页面
    // 我这里没有其他处理,直接去了登录页面
    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
登入後複製
至此,路由鉤子層面的鑑權處理完畢,不過細心的你可能注意到:導航去登入頁面呼叫的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请求拦截器代码
 "
/**
 * 请求拦截器,请求发送之前做些事情
 */
axios.interceptors.request.use(
 config => {
  // POST || PUT || DELETE请求时先格式化data数据
  // 这里需要引入第三方模块qs
  if (
   config.method.toLocaleUpperCase() === 'POST' ||
   config.method.toLocaleUpperCase() === 'PUT' ||
   config.method.toLocaleUpperCase() === 'DELETE'
  ) {
   config.data = qs.stringify(config.data)
  }
  // 配置Authorization参数携带用户token
  let userData = getUserData()
  if (userData.token) {
   config.headers.Authorization = userData.token
  }
  return config
 },
 error => {
  // 此处应为弹窗显示具体错误信息,因为是练手项目,劣者省略此处
  // 君可自行写 || 引入第三方UI框架
  console.error(error)
  return Promise.reject(error)
 }
)
登入後複製
axios回應攔截器代碼

/**
 * 响应拦截器,请求返回异常统一处理
 */
axios.interceptors.response.use(
 response => {
  // 这段代码很多场景下没用
  if (response.data && response.data.success === false) {
   // 根据实际情况的一些处理逻辑...
   return Promise.reject(response)
  }
  return response
 },
 error => {
  // 此处报错可能因素比较多
  // 1.需要授权处用户还未登录,因为路由段有验证是否登陆,此处理论上不会出现
  // 2.需要授权处用户登登录过期
  // 3.请求错误 4xx
  // 5.服务器错误 5xx
  // 关于鉴权失败,与后端约定状态码为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:
    // 状态码辣么多,按需配置...
    break
  }
  return Promise.reject(error)
 }
)
登入後複製
我相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:v

ue的select內建元件使用步驟詳解

怎麼操作vue select元件使用與停用#########

以上是怎樣對Vue2路由導航鉤子與axios攔截器封裝的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vue2與vue3中的生命週期執行順序有何不同 vue2與vue3中的生命週期執行順序有何不同 May 16, 2023 pm 09:40 PM

vue2與vue3中生命週期執行順序區別生命週期比較vue2中執行順序beforeCreate=>created=>beforeMount=>mounted=>beforeUpdate=>updated=>beforeDestroy=>destroyedvue3中執行順序setup=>onBefore>beforeDestroy=>destroyedvue3中執行順序setup=>onBefore>beforeDestroy=>destroyedvue3中執行順序setup=>onBefore> onBeforeUpdate=>onUpdated=>onBeforeUnmount=&g

導航地圖上橫著的8字是什麼 導航地圖上橫著的8字是什麼 Jun 27, 2023 am 11:43 AM

導航地圖上橫著的8字是霾,中度是黃色8預警訊號,重度是橘色8預警訊號。

快速搞懂Vue2 diff演算法(圖文詳解) 快速搞懂Vue2 diff演算法(圖文詳解) Mar 17, 2023 pm 08:23 PM

diff演算法是一種透過同層的樹節點進行比較的高效演算法,避免了對樹進行逐層搜尋遍歷。那麼大家對diff演算法嗎有多少了解呢?以下這篇文章就來帶大家深入解析下vue2的diff演算法,希望對大家有幫助!

百度地圖 App 最新版本 18.8.0 發布,首次引入紅綠燈雷達功能,並新增即時停車推薦功能 百度地圖 App 最新版本 18.8.0 發布,首次引入紅綠燈雷達功能,並新增即時停車推薦功能 Aug 06, 2023 pm 06:05 PM

百度地圖App安卓版/iOS版都已發布18.8.0版本,首次引入紅綠燈雷達功能,業界領先據官方介紹,開啟紅綠燈雷達後,支援開車自動探測紅綠燈,不用輸入目的地,北斗高精可以即時定位,全國100萬+紅綠燈自動觸發綠波提醒。除此之外,新功能還提供全程靜音導航,使圖區更簡潔,關鍵訊息一目了然,且無語音播報,使駕駛員更加專注駕駛百度地圖於2020年10月上線紅綠燈倒數功能,支援即時讀秒預判,導航會在接近紅綠燈路口時,自動展示倒數剩餘秒數,讓使用者隨時掌握前方路況。截至2022年12月31日,紅綠燈倒數

足球導航語音包在哪個導航軟體 足球導航語音包在哪個導航軟體 Nov 09, 2022 pm 04:33 PM

足球導航語音包在「高德導航」軟體中,是高德地圖車機版導航語音包的其中一種,內容為黃健翔足球解說版本的導航語音。設定方式:1、開啟高德地圖軟體;2、點擊進入“更多工具”-“導航語音”選項;3、找到“黃健翔熱血語音”,點擊“下載”;4、在彈出的頁面,點擊“使用語音」即可。

高德地圖推出升級版駕駛 ETA 服務:即時解析當前路況,預估抵達時間更精準 高德地圖推出升級版駕駛 ETA 服務:即時解析當前路況,預估抵達時間更精準 Apr 30, 2024 am 08:37 AM

本站4月29日消息,高德地圖官宣推出升級版的駕車ETA(本站註:ETA即預估到達時間,指的是用戶在當前時刻出發按照給定路線前往目的地預計需要的時長)服務,該服務旨在幫助用戶的路線規劃時長和路況預估更為精準,輔助用戶進行出行決策。該地圖應用程式是最新升級的高德地圖App,引入了“超大規模圖卷積神經網路模型”,該模型可以更好地捕捉和學習交通流動規律,支持城市道路網絡、高速公路系統,能以高精準度刻畫交通狀況的時空動態變化。在此外,全新版本的地圖也進一步融合了iTransformer時序預測模型,支援即時解析

如何透過Vue實現圖片的瀏覽和縮圖導航? 如何透過Vue實現圖片的瀏覽和縮圖導航? Aug 18, 2023 pm 02:51 PM

如何透過Vue實現圖片的瀏覽和縮圖導航?隨著Web應用程式的發展,圖片在我們的日常生活中扮演著越來越重要的角色。在許多情況下,我們需要實作圖片的瀏覽和縮圖導航功能。這篇文章將介紹如何利用Vue框架實現此功能,並提供程式碼範例。在Vue中,我們可以使用Vue插件來實現圖片的瀏覽和縮圖導航功能。一個流行的插件是vue-gallery,它提供了簡單易用的接口

uniapp中如何實現頁面跳躍與導航 uniapp中如何實現頁面跳躍與導航 Oct 20, 2023 pm 02:07 PM

uniapp中如何實現頁面跳轉和導航uniapp是一款支援一次編碼多端發布的前端框架,它基於Vue.js,開發者可以使用uniapp快速開發行動端應用程式。在uniapp中,實現頁面跳躍和導航是非常常見的需求。本文將介紹uniapp中如何實現頁面跳轉和導航,並提供具體的程式碼範例。一、頁面跳轉使用uniapp提供的方法進行頁面跳躍uniapp提供了一組方法用於實現

See all articles