Vue - 路由守衛(wèi)(路由的生命周期)

路由守衛(wèi)是什么更哄?

官方解釋:

“導(dǎo)航”表示路由正在發(fā)生改變厂僧。正如其名悲关,vue-router提供的導(dǎo)航守衛(wèi)主要用來通過跳轉(zhuǎn)或取消的方式守衛(wèi)導(dǎo)航蒲列。有多種機(jī)會植入路由導(dǎo)航過程中:全局的, 單個(gè)路由獨(dú)享的, 或者組件級的。

簡單的說争拐,導(dǎo)航守衛(wèi)就是路由跳轉(zhuǎn)過程中的一些鉤子函數(shù)腋粥。路由跳轉(zhuǎn)是一個(gè)大的過程,這個(gè)大的過程分為跳轉(zhuǎn)前中后等等細(xì)小的過程架曹,在每一個(gè)過程中都有一函數(shù)隘冲,這個(gè)函數(shù)能讓你操作一些其他的事兒,這就是導(dǎo)航守衛(wèi)绑雄。類似于組件生命周期鉤子函數(shù)

路由守衛(wèi)分類

【1】全局守衛(wèi):是指路由實(shí)例上直接操作的鉤子函數(shù)展辞,特點(diǎn)是所有路由配置的組件都會觸發(fā),直白點(diǎn)就是觸發(fā)路由就會觸發(fā)這些鉤子函數(shù)

  • beforeEach(to万牺,from罗珍, next)
  • beforeResolve(to,from脚粟, next)
  • afterEach(to覆旱,from)

【2】路由守衛(wèi):是指在單個(gè)路由配置的時(shí)候也可以設(shè)置的鉤子函數(shù)

  • beforeEnter(to,from珊楼, next)

【3】組件守衛(wèi):是指在組件內(nèi)執(zhí)行的鉤子函數(shù)通殃,類似于組件內(nèi)的生命周期,相當(dāng)于為配置路由的組件添加的生命周期鉤子函數(shù)厕宗。

  • beforeRouteEnter(to画舌,from, next)
  • beforeRouteUpdadte(to已慢,from曲聂, next)
  • beforeRouteLeave(to,from佑惠, next)

路由守衛(wèi)回調(diào)參數(shù)介紹

to:即將要進(jìn)入的目標(biāo)路由對象朋腋;

from:即將要離開的路由對象;

next:涉及到next參數(shù)的鉤子函數(shù)膜楷,必須調(diào)用next()方法來resolve這個(gè)鉤子旭咽,否則路由會中斷在這,不會繼續(xù)往下執(zhí)行

  • next():進(jìn)行管道中的下一個(gè)鉤子赌厅。如果全部鉤子執(zhí)行完了穷绵,則導(dǎo)航的狀態(tài)就是confirmed(確認(rèn)的)。
  • next( false )中斷當(dāng)前的導(dǎo)航特愿。如果瀏覽器的 URL 改變了 (可能是用戶手動或者瀏覽器后退按鈕)仲墨,那么 URL 地址會重置到from路由對應(yīng)的地址勾缭。
  • next( ' / ')或者next({ paht:' / ' }):跳轉(zhuǎn)到一個(gè)不同的地址。當(dāng)前的導(dǎo)航被中斷目养,然后進(jìn)行一個(gè)新的導(dǎo)航俩由。可傳遞的參數(shù)可以是router-link標(biāo)簽中的to屬性參數(shù)或router.push中的選項(xiàng)
  • next( error ):如果傳入next的參數(shù)是一個(gè)Error實(shí)例癌蚁,則導(dǎo)航會被終止且該錯(cuò)誤會被傳遞給router.onError()注冊過的回調(diào)幻梯。

路由守衛(wèi)詳解

【1】全局前置守衛(wèi)(beforeEach): 在路由跳轉(zhuǎn)前觸發(fā),這個(gè)鉤子作用主要是用于登錄驗(yàn)證匈勋,也就是路由還沒跳轉(zhuǎn)提前告知礼旅,以免跳轉(zhuǎn)了再通知就為時(shí)已晚。

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  // ...
})

【2】全局解析守衛(wèi)(beforeResolve): 這個(gè)鉤子和beforeEach類似洽洁,也是路由跳轉(zhuǎn)前觸發(fā),區(qū)別是在導(dǎo)航被確認(rèn)之前菲嘴,同時(shí)在所有組件內(nèi)守衛(wèi)和異步路由組件被解析之后饿自,即在 beforeEach 和 組件內(nèi)beforeRouteEnter 之后,afterEach之前調(diào)用龄坪。

【3】全局后置鉤子(afterEach): 和beforeEach相反昭雌,它是在路由跳轉(zhuǎn)完成后觸發(fā),它發(fā)生在beforeEach和beforeResolve之后健田,beforeRouteEnter(組件內(nèi)守衛(wèi))之前烛卧。這些鉤子不會接受next函數(shù)也不會改變導(dǎo)航本身

router.afterEach((to, from) => {
  // ...
})

【4】路由獨(dú)享守衛(wèi)(beforeEnter): 和beforeEach完全相同,如果兩個(gè)都設(shè)置了妓局,beforeEnter則在beforeEach之后緊隨執(zhí)行总放。在路由配置上直接定義beforeEnter守衛(wèi)

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

【5】組件內(nèi)的守衛(wèi):

<template>
  ...
</template>
<script>
export default{
  data(){
    //...
  },
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應(yīng)路由被 confirm 前調(diào)用
    // 不!能好爬!獲取組件實(shí)例 `this`
    // 因?yàn)楫?dāng)守衛(wèi)執(zhí)行前局雄,組件實(shí)例還沒被創(chuàng)建
  },
  beforeRouteUpdate (to, from, next) {
    // 在當(dāng)前路由改變,但是該組件被復(fù)用時(shí)調(diào)用
    // 舉例來說存炮,對于一個(gè)帶有動態(tài)參數(shù)的路徑 /foo/:id炬搭,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時(shí)候,
    // 由于會渲染同樣的 Foo 組件穆桂,因此組件實(shí)例會被復(fù)用宫盔。而這個(gè)鉤子就會在這個(gè)情況下被調(diào)用。
    // 可以訪問組件實(shí)例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 導(dǎo)航離開該組件的對應(yīng)路由時(shí)調(diào)用
    // 可以訪問組件實(shí)例 `this`
  }
}
</script>
<style>
  ...
</style>

1. beforeRouteEnter:該鉤子在全局守衛(wèi)beforeEach和獨(dú)享守衛(wèi)beforeEnter之后享完,全局beforeResolve和全局afterEach之前調(diào)用灼芭,要注意的是該守衛(wèi)內(nèi)訪問不到組件的實(shí)例,也就是this為undefined驼侠。因?yàn)樗诮M件生命周期beforeCreate階段觸發(fā)姿鸿,此時(shí)的新組件還沒有被創(chuàng)建谆吴。在這個(gè)鉤子函數(shù)中,可以通過傳一個(gè)回調(diào)給 next來訪問組件實(shí)例苛预。在導(dǎo)航被確認(rèn)的時(shí)候執(zhí)行回調(diào)句狼,并且把組件實(shí)例作為回調(diào)方法的參數(shù)。

beforeRouteEnter (to, from, next) {
  next(vm => {
    // 通過 `vm` 訪問組件實(shí)例
  })
}

2. beforeRouteUpdadte:在當(dāng)前路由改變時(shí)热某,并且該組件被復(fù)用時(shí)調(diào)用腻菇,可以通過this訪問實(shí)例。

3. beforeRouteLeave:導(dǎo)航離開該組件的對應(yīng)路由時(shí)調(diào)用昔馋,可以訪問組件實(shí)例this筹吐。這個(gè)離開守衛(wèi)通常用來禁止用戶在還未保存修改前突然離開。該導(dǎo)航可以通過next( false )來取消秘遏。

beforeRouteLeave (to, from , next) {
  const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
  if (answer) {
    next()
  } else {
    next(false)
  }
}

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

  1. 觸發(fā)進(jìn)入其它路由
  2. 調(diào)用要離開路由的組件守衛(wèi)beforeRouteLeave
  3. 調(diào)用全局的前置守衛(wèi)beforeEach
  4. 在重用的組件里調(diào)用 beforeRouteUpdate
  5. 在路由配置里調(diào)用 beforeEnter
  6. 解析異步路由組件
  7. 在將要進(jìn)入的路由組件中調(diào)用beforeRouteEnter
  8. 調(diào)用全局的解析守衛(wèi)beforeResolve
  9. 導(dǎo)航被確認(rèn)
  10. 調(diào)用全局的后置鉤子afterEach丘薛。
  11. 觸發(fā) DOM 更新mounted
  12. 執(zhí)行beforeRouteEnter守衛(wèi)中傳給 next的回調(diào)函數(shù)邦危。

文章每周持續(xù)更新洋侨,可以微信搜索「 前端大集錦 」第一時(shí)間閱讀,回復(fù)【視頻】【書籍】領(lǐng)取200G視頻資料和30本PDF書籍資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倦蚪,一起剝皮案震驚了整個(gè)濱河市希坚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陵且,老刑警劉巖裁僧,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異慕购,居然都是意外死亡聊疲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門脓钾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來售睹,“玉大人,你說我怎么就攤上這事可训〔茫” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵握截,是天一觀的道長飞崖。 經(jīng)常有香客問我,道長谨胞,這世上最難降的妖魔是什么固歪? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上牢裳,老公的妹妹穿的比我還像新娘逢防。我一直安慰自己,他們只是感情好蒲讯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布忘朝。 她就那樣靜靜地躺著,像睡著了一般判帮。 火紅的嫁衣襯著肌膚如雪局嘁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天晦墙,我揣著相機(jī)與錄音悦昵,去河邊找鬼。 笑死晌畅,一個(gè)胖子當(dāng)著我的面吹牛但指,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踩麦,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼枚赡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谓谦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤贪婉,失蹤者是張志新(化名)和其女友劉穎反粥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疲迂,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡才顿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尤蒿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郑气。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腰池,靈堂內(nèi)的尸體忽然破棺而出尾组,到底是詐尸還是另有隱情,我是刑警寧澤示弓,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布讳侨,位于F島的核電站,受9級特大地震影響奏属,放射性物質(zhì)發(fā)生泄漏跨跨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一囱皿、第九天 我趴在偏房一處隱蔽的房頂上張望勇婴。 院中可真熱鬧忱嘹,春花似錦、人聲如沸耕渴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萨螺。三九已至窄做,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慰技,已是汗流浹背椭盏。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吻商,地道東北人掏颊。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像艾帐,于是被迫代替她去往敵國和親乌叶。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350