溫馨提示×

溫馨提示×

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

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

vue中使用router全局守衛實現頁面攔截

發布時間:2020-10-26 14:39:09 來源:億速云 閱讀:173 作者:Leah 欄目:開發技術

本篇文章為大家展示了vue中使用router全局守衛實現頁面攔截,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

一、背景

  在vue項目中使用vue-router做頁面跳轉時,路由的方式有兩種,一種是靜態路由,另一種是動態路由。而要實現對路由的控制需要使用vuex和router全局守衛進行判斷攔截(安全問題文章最后討論)

二、使用場景

  靜態路由的使用場景:在我們使用靜態路由實現頁面跳轉時,不管我們是否登錄,當我們在地址欄修改地址后,頁面會發生跳轉并展示頁面內容(數據并不會被展示出來),這樣的問題顯然是不能夠被接受的;

  動態路由的使用場景:動態路由無非就是從后端拿到了數據然后在加到router里面了。假如用戶登錄了,在地址欄修改地址便能直接訪問。所以動態路由并不能起到攔截作用。

三、解決方案

  使用vuex+router.beforeEach()+動態路由實現頁面攔截

    頁面刷新時會清楚vuex里面的值;(防止直接修改地址欄)

    router.beforeEach()對跳轉前進行攔截判斷;(對vuex里面的值進行判斷)

    當用戶登錄時請求后臺拿到數據,加載路由.(跳轉頁面)

四、實現過程

1.首先定義vuex里面的值,需要定義兩個值:

a.登錄狀態信息的值 loginInfo 

b.存儲動態路由的值 routerList

vue中使用router全局守衛實現頁面攔截

2.router.beforeEach()對路由跳轉前進行控制 

//全局守衛
router.beforeEach((to, from, next)=> {
 let userId = store.state.loginInfo.id;
 //這里是對登錄后的值進行判斷,也可對token的值進行判斷
 if (userId === '') {
  if (to.meta.requireAuth || to.name == null) {
  next({path: '/'})
  } else {
  next();
  }
 } else {
  //初始化動態路由方法
  initRouter(router, store); 
  next();
 }
 }
);

3.初始化動態路由

在全局守衛對應條件下加載動態路由數據routerList和在登錄成功時存儲登錄成功的信息loginInfo 

新建一個xxx.js文件 引入axios 創建一個函數并使用export 暴露該方法;

請求成功拿到數據后,把數據造成和routes里的數據一樣。然后使用 router.addRoutes 添加進去;

index中的默認路由

vue中使用router全局守衛實現頁面攔截

import axios from 'axios'
export const initRouter = (router,store)=>{
 if (store.state.routerList.length > 0) {
 return;
 }
 axios.get(' URL')
  .then((rest)=>{
  let routerList = [];
  if(rest.data.success){
  let routers = rest.data.body;
  routers.forEach(router=>{
   let {
    path,
    component,
    name,
   } = router
   let routerObj = {
    path:path,
    name:name,
    component(resolve){
    if (component.startsWith("index")) {
     require(['../components/' + component + '.vue'], resolve)
    }  
    
    },
    meta:{requireAuth:true} //是否是登錄權限控制
   };
   routerList.push(routerObj);
   });
  //add到router中
  router.addRoutes(routerList); 
  //存儲到vuex中
  store.commit('routerList', routerList); 

  }else{
   console.log(rest.data.error);
  }
 }).catch((error)=>{
  console.log(error);
 })
}

4.登錄成功后存儲成功狀態信息并跳轉頁面

vue中使用router全局守衛實現頁面攔截

 至此,頁面攔截功能已實現。

五、總結

  該方法實現主要用到了:

  1.vuex及頁面刷新時會對vuex進行清空,所以比如退出時要對頁面window.location.reload(),其它地方類似。

  2.router.beforeEach()鉤子函數及關鍵的router.addRoutes方法

  3.es6的一些寫法

上述內容就是vue中使用router全局守衛實現頁面攔截,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女