Vue-Router路由鈎子


路由鈎子函數有三種:

            1:全局鈎子: beforeEach、 afterEach

            2:單個路由里面的鈎子:  beforeEnter、 beforeLeave

            3:組件路由:beforeRouteEnter、 beforeRouteUpdate、 beforeRouteLeave

1.全局守衛

無論訪問哪一個路徑,都會觸發全局的鈎子函數,位置是調用router的方法

router.beforeEach() 進入之前觸發

router.afterEach() 進入之后觸發

 

⑴ beforeEach(全局前置守衛)

使用 router.beforeEach 注冊一個全局前置守衛

 
 

每個守衛方法接收三個參數:

to: Route: 即將要進入的目標路由對象(to是一個對象,是將要進入的路由對象,可以用to.path調用路由對象中的屬性)

from: Route: 當前導航正要離開的路由

next: Function: 這是一個必須需要調用的方法,執行效果依賴 next 方法的調用參數。

next參數:

    next(): 進行管道中的下一個鈎子。如果全部鈎子執行完了,則導航的狀態就是confirmed (確認的)。

    next(false): 中斷當前的導航。如果瀏覽器的 URL 改變了 (可能是用戶手動或者瀏覽器后退按 鈕),那么 URL 地址會重置到 from 路由對應的地址。

    next('/') 或者 next({ path: '/' }): 跳轉到一個不同的地址。當前的導航被中斷,然后進行一個新的導航。你可以向 next 傳遞任意位置對象,且允許設置諸如 replace: true、name: 'home' 之類的選項以及任何用在router-link 的 to proprouter.push中的選項。

    next(error): (2.4.0+) 如果傳入 next 的參數是一個 Error 實例,則導航會被終止且該錯誤會被傳遞給router.onError()注冊過的回調。

ps~ : 確保要調用 next 方法,否則鈎子就不會被 resolved。

(2). afterEach(全局后置鈎子)

 
 

和守衛不同的是,這些鈎子不會接受 next 函數也不會改變導航本身

2.路由獨享的守衛(單個路由獨享的)

寫在路由配置中,只有訪問到這個路徑,才能觸發鈎子函數

 
這些守衛與全局前置守衛的方法參數是一樣的。

3.組件級路由鈎子

寫在組件中,訪問路徑,即將渲染組件的時候觸發的

{

data,

methods

beforeRouteEnter(){

        this 不指向實例 組件還沒創建

        next((vm) =>{

                vm就是實例

        })

}

beforeRouteUpdate(){}

beforeRouteLeave(){}

}

 

 
 

beforeRouteEnter 守衛 不能 訪問 this,因為守衛在導航確認前被調用,因此即將登場的新組件還沒被創建。不過,你可以通過傳一個回調給 next來訪問組件實例。在導航被確認的時候執行回調,並且把組件實例作為回調方法的參數。

 
 

注意~ : beforeRouteEnter 是支持給 next 傳遞回調的唯一守衛。對於 beforeRouteUpdate 和 beforeRouteLeave 來說,this 已經可用了,所以不支持傳遞回調,因為沒有必要了。

這個離開守衛beforeRouteLeave()通常用來禁止用戶在還未保存修改前突然離開。該導航可以通過 next(false) 來取消。

 
 

完整的導航解析流程:

1.導航被觸發。

2.在失活的組件里調用離開守衛。

3.調用全局的 beforeEach 守衛。

4.在重用的組件里調用 beforeRouteUpdate 守衛 (2.2+)。

5.在路由配置里調用 beforeEnter。

6.解析異步路由組件。

7.在被激活的組件里調用 beforeRouteEnter。

8.調用全局的 beforeResolve 守衛 (2.5+)。

9.導航被確認。

10.調用全局的 afterEach 鈎子。

11.觸發 DOM 更新。

12.用創建好的實例調用 beforeRouteEnter 守衛中傳給 next 的回調函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM