Vue2.0路由進階僚楞,為什么要學(xué)習(xí)導(dǎo)航守衛(wèi)勤晚?

我們在每學(xué)一項新知識的時候,首先我們得至少這項知識有什么用泉褐,能為我們解決什么問題运翼。對吧?
導(dǎo)航守衛(wèi)兴枯,也稱路由守衛(wèi)
怎么理解這個名詞呢血淌?
官方解釋:vue-router 提供的導(dǎo)航守衛(wèi)主要用來通過跳轉(zhuǎn)或取消的方式守衛(wèi)導(dǎo)航。
簡單來說财剖,就是路由跳轉(zhuǎn)時我們要進行的操作
舉個栗子悠夯,比如登錄跳轉(zhuǎn)
我們在登錄跳轉(zhuǎn)之前必須先做登錄驗證
在我們沒有登陸之前,我們當然不能跳轉(zhuǎn)到某個路由對象

以下內(nèi)容是我結(jié)合官方文檔總結(jié)出來的↓↓↓

路由守衛(wèi)可以分成以下幾類

一躺坟、全局前置守衛(wèi)
二沦补、全局解析守衛(wèi)
三、全局后置鉤子
四咪橙、路由獨享守衛(wèi)
五夕膀、組件內(nèi)守衛(wèi)

我們先看一下整個導(dǎo)航解析流程↓↓↓

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

一、導(dǎo)航被觸發(fā)
二美侦、在失活的組件产舞,也就是即將離開的頁面組件里調(diào)用離開守衛(wèi)beforeRouteLeave
三、調(diào)用全局的前置守衛(wèi)beforeEach
四菠剩、在重用的組件里調(diào)用里調(diào)用beforeRouteUpdate
五易猫、調(diào)用路由獨享的守衛(wèi)beforeEnter
六、解析異步路由組件
七具壮、在被激活的組件里准颓,也就是即將進入的頁面組件里面調(diào)用beforeRouteEnter
八、調(diào)用全局的解析守衛(wèi)beforeResolve
九棺妓、導(dǎo)航被確認
十攘已、調(diào)用全局的后置鉤子afterEach
十一、觸發(fā)DOM更新
十二怜跑、創(chuàng)建好的實例調(diào)用beforeRouteEnter守衛(wèi)里傳給next的回調(diào)函數(shù)

全局前置守衛(wèi)

我們可以使用router.beforeEach注冊一個全局前置路由
前置路由里面放的是頁面跳轉(zhuǎn)之前要處理的邏輯
router.beforeEach( (to, from, next) => { } )
當一個導(dǎo)航觸發(fā)時样勃,全局前置路由按照創(chuàng)建順序調(diào)用。守衛(wèi)是異步解析執(zhí)行妆艘,此時導(dǎo)航在所有守衛(wèi)resolve完之前一直處于等待中彤灶。

參數(shù)解析:
to:即將要進入的目標
from:當前導(dǎo)航正要離開的路由
next:前面的tofrom都是路由對象,而這里的next是一個方法批旺,一定要調(diào)用該方法來resolve這個鉤子幌陕,執(zhí)行效果依賴next方法的調(diào)用參數(shù)。

  1. next()進行管道中的下一個鉤子汽煮。如果全部鉤子執(zhí)行完了搏熄,則導(dǎo)航的狀態(tài)就是confirmed
  2. next(false)中斷當前的導(dǎo)航棚唆。如果瀏覽器的URL改變了(可能是用戶手動點擊瀏覽器后退按鈕) ,那個URL地址會重置到from路由對應(yīng)的地址心例。
  3. next(‘/’)或者next({ path: ‘/’})跳轉(zhuǎn)到一個不同的地址宵凌。當前的導(dǎo)航被中斷,然后進行一個新的導(dǎo)航止后。
  4. next(error)如果傳入next的參數(shù)是一個Error實例瞎惫,則導(dǎo)航會被種植且該錯誤會被傳遞給router.onError()注冊過的回調(diào)。

確保要調(diào)用next方法译株,否則鉤子就不會被resolved

全局解析守衛(wèi)

我們可以用router.beforeResolve注冊一個全局守衛(wèi)瓜喇。
router.beforeResolve(to, from, next)也是一個全局守衛(wèi),這和router.beforeEach類似歉糜,區(qū)別是在導(dǎo)航被確認(所有導(dǎo)航鉤子都結(jié)束)之前乘寒,同時在所有組件內(nèi)守衛(wèi)和異步路由被解析之后,解析守衛(wèi)就被調(diào)用匪补。

全局后置鉤子

一般是用于處理路由跳轉(zhuǎn)后的一些操作
router.afterEach( (to, from) => {} )

路由獨享守衛(wèi)

路由獨享守衛(wèi)是在路由列表里面配置
如:

{
  path: ‘home’,
  component: Home,
  beforeEnter: (to, from, next) => {
  if (from.name == login) { console.log(‘這是從登錄頁跳轉(zhuǎn)過來的’)}
  else { console.log(‘這不是從登錄頁跳轉(zhuǎn)過來的’) }
  next()  //如果添加了beforeEnter()記得一定要調(diào)用next()這個鉤子伞辛,要不然路由不會跳轉(zhuǎn)
  }
}

組件內(nèi)守衛(wèi)

組件內(nèi)守衛(wèi),就是在.vue文件里面的守衛(wèi)
有三個鉤子函數(shù)

beforeRouteEnter-進入組件之前

beforeRouteEnter(to, from, next){}  //頁面還沒渲染好的時候調(diào)用夯缺,不能使用this

在進入組件前被調(diào)用蚤氏,組件實例還沒有被創(chuàng)建,不能使用this關(guān)鍵字

不過可以通過傳一個回調(diào)next來訪問組件實例喳逛,也就是可以通過next回調(diào)實例化后的組件瞧捌,用next函數(shù)的vm參數(shù)充當this

export default {
  data(){
    return{
      infor:'ThinkBig'
    }
  },
  beforeRouteEnter:(to,from,next)=>{
  //此時該組件還沒被實例化
    alert(this.infor);       //彈出消息框信息為 undefined
      next(vm =>{
      //此時該組件被實例化了
        alert(vm.infor);         //彈出消息框信息為 ThinkBig
      })
}

beforeRouteLeave-離開組件之后

離開組件之后調(diào)用,可以調(diào)用this關(guān)鍵字
beforeRouteLeave(to, from, next) {}

export default {
  beforeRouteLeave(to,from,next){
    if(confirm("確定離開嗎润文?") == true){
      next()   //跳轉(zhuǎn)到另一個路由
    }else{
      next(false);//不跳轉(zhuǎn)
    }
  }
}

boforeRouteUpdate-組件復(fù)用觸發(fā)更新

該組件被復(fù)用時調(diào)用,可以調(diào)用this關(guān)鍵字

boforeRouteUpdate(to, from, next) {
  //在當前路由改變殿怜,但是該組件被復(fù)用時調(diào)用
  //舉例來說典蝌,對于一個帶有動態(tài)參數(shù)的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時候头谜,
  //由于會渲染同樣的 Foo 組件骏掀,因此組件實例會被復(fù)用。而這個鉤子就會在這個情況下被調(diào)用柱告。
  //可以訪問組件實例 `this`
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末截驮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子际度,更是在濱河造成了極大的恐慌葵袭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乖菱,死亡現(xiàn)場離奇詭異坡锡,居然都是意外死亡蓬网,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門鹉勒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帆锋,“玉大人,你說我怎么就攤上這事禽额【庀幔” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵脯倒,是天一觀的道長哲鸳。 經(jīng)常有香客問我,道長盔憨,這世上最難降的妖魔是什么徙菠? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮郁岩,結(jié)果婚禮上婿奔,老公的妹妹穿的比我還像新娘。我一直安慰自己问慎,他們只是感情好萍摊,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著如叼,像睡著了一般冰木。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笼恰,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天踊沸,我揣著相機與錄音,去河邊找鬼社证。 笑死逼龟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的追葡。 我是一名探鬼主播腺律,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宜肉!你這毒婦竟也來了匀钧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谬返,失蹤者是張志新(化名)和其女友劉穎之斯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朱浴,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡吊圾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年达椰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片项乒。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡啰劲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出檀何,到底是詐尸還是另有隱情蝇裤,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布频鉴,位于F島的核電站栓辜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏垛孔。R本人自食惡果不足惜藕甩,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望周荐。 院中可真熱鬧狭莱,春花似錦、人聲如沸概作。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讯榕。三九已至骤素,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愚屁,已是汗流浹背济竹。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留集绰,地道東北人规辱。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像栽燕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子改淑,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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