最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue中使用router全局守衛(wèi)實(shí)現(xiàn)頁面攔截的示例

 更新時(shí)間:2020年10月23日 15:23:58   作者:蟈民黨  
這篇文章主要介紹了vue中使用router全局守衛(wèi)實(shí)現(xiàn)頁面攔截的示例,幫助大家維護(hù)自己的項(xiàng)目,感興趣的朋友可以了解下

一、背景

  在vue項(xiàng)目中使用vue-router做頁面跳轉(zhuǎn)時(shí),路由的方式有兩種,一種是靜態(tài)路由,另一種是動(dòng)態(tài)路由。而要實(shí)現(xiàn)對路由的控制需要使用vuex和router全局守衛(wèi)進(jìn)行判斷攔截(安全問題文章最后討論)

二、使用場景

  靜態(tài)路由的使用場景:在我們使用靜態(tài)路由實(shí)現(xiàn)頁面跳轉(zhuǎn)時(shí),不管我們是否登錄,當(dāng)我們在地址欄修改地址后,頁面會(huì)發(fā)生跳轉(zhuǎn)并展示頁面內(nèi)容(數(shù)據(jù)并不會(huì)被展示出來),這樣的問題顯然是不能夠被接受的;

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

三、解決方案

  使用vuex+router.beforeEach()+動(dòng)態(tài)路由實(shí)現(xiàn)頁面攔截

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

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

    當(dāng)用戶登錄時(shí)請求后臺(tái)拿到數(shù)據(jù),加載路由.(跳轉(zhuǎn)頁面)

四、實(shí)現(xiàn)過程

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

a.登錄狀態(tài)信息的值 loginInfo 

b.存儲(chǔ)動(dòng)態(tài)路由的值 routerList

2.router.beforeEach()對路由跳轉(zhuǎn)前進(jìn)行控制 

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

3.初始化動(dòng)態(tài)路由

在全局守衛(wèi)對應(yīng)條件下加載動(dòng)態(tài)路由數(shù)據(jù)routerList和在登錄成功時(shí)存儲(chǔ)登錄成功的信息loginInfo 

新建一個(gè)xxx.js文件 引入axios 創(chuàng)建一個(gè)函數(shù)并使用export 暴露該方法;

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

index中的默認(rèn)路由

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} //是否是登錄權(quán)限控制
   };
   routerList.push(routerObj);
   });
  //add到router中
  router.addRoutes(routerList); 
  //存儲(chǔ)到vuex中
  store.commit('routerList', routerList); 

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

4.登錄成功后存儲(chǔ)成功狀態(tài)信息并跳轉(zhuǎn)頁面

 至此,頁面攔截功能已實(shí)現(xiàn)。

五、總結(jié)

  該方法實(shí)現(xiàn)主要用到了:

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

  2.router.beforeEach()鉤子函數(shù)及關(guān)鍵的router.addRoutes方法

  3.es6的一些寫法

以上就是vue中使用router全局守衛(wèi)實(shí)現(xiàn)頁面攔截的示例的詳細(xì)內(nèi)容,更多關(guān)于vue 頁面攔截的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

沙田区| 朝阳县| 红原县| 鄂尔多斯市| 延长县| 含山县| 西宁市| 越西县| 蓬安县| 红安县| 玉环县| 泰来县| 新营市| 和平县| 阿瓦提县| 友谊县| 慈利县| 哈尔滨市| 靖江市| 嫩江县| 墨江| 习水县| 阿坝县| 定边县| 敦化市| 武隆县| 南皮县| 靖西县| 平泉县| 万山特区| 商南县| 呼玛县| 依安县| 江都市| 武冈市| 祥云县| 阳西县| 富平县| 绩溪县| 通山县| 阜城县|