Vue-Router中的導(dǎo)航守衛(wèi)

路由跳轉(zhuǎn)前做一些驗(yàn)證型将,比如登錄驗(yàn)證,是網(wǎng)站中的普遍需求。

對(duì)此,vue-route 提供的 beforeRouteUpdate 可以方便地實(shí)現(xiàn)導(dǎo)航守衛(wèi)(navigation-guards)琴锭。


在一個(gè)網(wǎng)站中,訪問除了登錄以外的接口往往都需要驗(yàn)證用戶的個(gè)人信息衙传,由于后臺(tái)的登錄信息在一定的時(shí)間后會(huì)失效决帖,這個(gè)時(shí)候我們?cè)谔D(zhuǎn)頁(yè)面的時(shí)候再訪問別的接口的時(shí)候,由于沒有登錄信息可能導(dǎo)致接口報(bào)錯(cuò)蓖捶。一般我們會(huì)在vue組件的beforeCreate周期中寫一個(gè)驗(yàn)證登錄信息接口地回,以驗(yàn)證用戶信息是否失效。

事實(shí)上上面的操作并沒有什么軟用俊鱼,之前在vue生命周期和異步加載的關(guān)系一文中就指出了異步操作是獨(dú)立于生命周期之外的操作刻像,因此vue并不會(huì)乖乖的先執(zhí)行完beforeCreate周期中的異步操作,驗(yàn)證了信息后再執(zhí)行下一周期并闲,而是先執(zhí)行完整個(gè)生命周期再執(zhí)行異步操作细睡,這樣的做法會(huì)導(dǎo)致,vue實(shí)例在渲染dom的時(shí)候由于大量數(shù)據(jù)得不到焙蚓,渲染出一個(gè)很丑的頁(yè)面纹冤,直到驗(yàn)證登陸信息接口訪問完畢洒宝,才能返回登錄頁(yè)购公。不僅如此,由于異步操作的執(zhí)行時(shí)間不定雁歌,還可能出現(xiàn)大量的頁(yè)面報(bào)錯(cuò)宏浩,總之,這么做可以靠瞎,但體驗(yàn)很差比庄。

vue-router提供了導(dǎo)航守衛(wèi)求妹,幫助我們解決一些在組件加載之前,可以做一些操作佳窑,尤其是異步操作制恍,這樣可以避免組件加載完畢后,卻沒有數(shù)據(jù)的尷尬神凑。當(dāng)然净神,你不應(yīng)該在組件加載之前做太多的異步操作,這樣會(huì)導(dǎo)致頁(yè)面的白屏?xí)r間過長(zhǎng)溉委,用戶體驗(yàn)也很差鹃唯,所以,須慎用導(dǎo)航守衛(wèi)瓣喊。


下面寫一個(gè)例子:

列舉需要判斷登錄狀態(tài)的“路由集合”坡慌,當(dāng)跳轉(zhuǎn)至集合中的路由時(shí),如果“未登錄狀態(tài)”藻三,則跳轉(zhuǎn)到登錄頁(yè)面LoginPage洪橘;
當(dāng)直接進(jìn)入登錄頁(yè)面LoginPage時(shí),如果“已登錄狀態(tài)”棵帽,則跳轉(zhuǎn)到首頁(yè)HomePage梨树;

import Vue from 'vue';
import Router from 'vue-router';
import LoginPage from '@/pages/login';
import HomePage from '@/pages/home';
import GoodsListPage from '@/pages/good-list';
import GoodsDetailPage from '@/pages/good-detail';
import CartPage from '@/pages/cart';
import ProfilePage from '@/pages/profile';

Vue.use(Router)

const router = new Router({
  routes: [
    {
      path: '/',  // 默認(rèn)進(jìn)入路由
      redirect: '/home'   //重定向
    },
    {
      path: '/login',
      name: 'login',
      component: LoginPage
    },
    {
      path: '/home',
      name: 'home',
      component: HomePage
    },
    {
      path: '/good-list',
      name: 'good-list',
      component: GoodsListPage
    },
    {
      path: '/good-detail',
      name: 'good-detail',
      component: GoodsDetailPage
    },
    {
      path: '/cart',
      name: 'cart',
      component: CartPage
    },
    {
      path: '/profile',
      name: 'profile',
      component: ProfilePage
    },
    {
      path: '**',   // 錯(cuò)誤路由
      redirect: '/home'   //重定向
    },
  ]
});

// 全局路由守衛(wèi)
router.beforeEach((to, from, next) => {
  console.log('navigation-guards');
  // to: Route: 即將要進(jìn)入的目標(biāo) 路由對(duì)象
  // from: Route: 當(dāng)前導(dǎo)航正要離開的路由
  // next: Function: 一定要調(diào)用該方法來(lái) resolve 這個(gè)鉤子。執(zhí)行效果依賴 next 方法的調(diào)用參數(shù)岖寞。

  const nextRoute = ['home', 'good-list', 'good-detail', 'cart', 'profile'];
  let isLogin = global.isLogin;  // 是否登錄
  // 未登錄狀態(tài)抡四;當(dāng)路由到nextRoute指定頁(yè)時(shí),跳轉(zhuǎn)至login
  if (nextRoute.indexOf(to.name) >= 0) {  
    if (!isLogin) {
      console.log('what fuck');
      router.push({ name: 'login' })
    }
  }
  // 已登錄狀態(tài)仗谆;當(dāng)路由到login時(shí)指巡,跳轉(zhuǎn)至home 
  if (to.name === 'login') {
    if (isLogin) {
      router.push({ name: 'home' });
    }
  }
  next();
});

export default router;

這是Vue官方文檔中對(duì)導(dǎo)航守衛(wèi)的定義
https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%89%8D%E7%BD%AE%E5%AE%88%E5%8D%AB
分別寫了一下5種守衛(wèi):

  • 全局前置守衛(wèi)
  • 全局解析守衛(wèi)
  • 全局后置鉤子
  • 路由獨(dú)享的守衛(wèi)
  • 組件內(nèi)的守衛(wèi)

完整的導(dǎo)航解析流程

  1. 導(dǎo)航被觸發(fā)。
  2. 在失活的組件里調(diào)用離開守衛(wèi)隶垮。
  3. 調(diào)用全局的 beforeEach 守衛(wèi)藻雪。
  4. 在重用的組件里調(diào)用 beforeRouteUpdate 守衛(wèi) (2.2+)。
  5. 在路由配置里調(diào)用 beforeEnter狸吞。
  6. 解析異步路由組件勉耀。
  7. 在被激活的組件里調(diào)用 beforeRouteEnter。
  8. 調(diào)用全局的 beforeResolve 守衛(wèi) (2.5+)蹋偏。
  9. 導(dǎo)航被確認(rèn)便斥。
  10. 調(diào)用全局的 afterEach 鉤子。
  11. 觸發(fā) DOM 更新威始。
  12. 用創(chuàng)建好的實(shí)例調(diào)用 beforeRouteEnter 守衛(wèi)中傳給 next 的回調(diào)函數(shù)枢纠。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市黎棠,隨后出現(xiàn)的幾起案子晋渺,更是在濱河造成了極大的恐慌镰绎,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件木西,死亡現(xiàn)場(chǎng)離奇詭異畴栖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)八千,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門驶臊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人叼丑,你說(shuō)我怎么就攤上這事关翎。” “怎么了鸠信?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵纵寝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我星立,道長(zhǎng)爽茴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任绰垂,我火速辦了婚禮室奏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劲装。我一直安慰自己胧沫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布占业。 她就那樣靜靜地躺著绒怨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谦疾。 梳的紋絲不亂的頭發(fā)上南蹂,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音念恍,去河邊找鬼六剥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛峰伙,可吹牛的內(nèi)容都是我干的疗疟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼词爬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秃嗜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起顿膨,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锅锨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后恋沃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體必搞,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年囊咏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恕洲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梅割,死狀恐怖霜第,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情户辞,我是刑警寧澤泌类,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站底燎,受9級(jí)特大地震影響刃榨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜双仍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一枢希、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朱沃,春花似錦苞轿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至敬察,卻和暖如春秀睛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背莲祸。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工蹂安, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锐帜。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓田盈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缴阎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子允瞧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • 前言 vue-router是什么:是vue.js官方的路由管理器和vue.js的核心深度的集成,讓開發(fā)者更加簡(jiǎn)單的...
    GUAN_one閱讀 3,694評(píng)論 0 2
  • 目錄 - 1.vue-router 動(dòng)態(tài)路由匹配 - 2.router-link組件及其屬性 - 3.vue-ro...
    我跟你蔣閱讀 1,119評(píng)論 0 7
  • ## 框架和庫(kù)的區(qū)別?> 框架(framework):一套完整的軟件設(shè)計(jì)架構(gòu)和**解決方案**。> > 庫(kù)(lib...
    Rui_bdad閱讀 2,895評(píng)論 1 4
  • Vue知識(shí)點(diǎn)的總結(jié) Vue中的指令及其基本語(yǔ)法: 第一步:從官網(wǎng)上下載vue開發(fā)版本的js文件 引入js文件 ...
    往前走莫回頭_2cd6閱讀 1,462評(píng)論 0 1
  • 導(dǎo)航守衛(wèi) 導(dǎo)航表示路由正在發(fā)生改變述暂。vue-router提供的導(dǎo)航守衛(wèi)主要用來(lái)通過跳轉(zhuǎn)或取消的方式守衛(wèi)導(dǎo)航痹升。有多種...
    oWSQo閱讀 689評(píng)論 0 0