詳解vue-router 中的導航鈎子


vue-router 的導航鈎子,主要作用是攔截導航,讓他完成跳轉或取消。

有三種方式可以植入路由導航過程中:

  • 全局的
  • 單個路由獨享的
  • 組件級的

1. 全局導航鈎子:

   全局導航鈎子主要有兩種鈎子:前置守衛、后置鈎子, 注冊一個全局前置守衛:

const router = new VueRouter({ ... });
router.beforeEach((to, from, next) => {
    // do someting
});
router.afterEach((to, from) => {
    // do someting
});

這三個參數 to 、from 、next 分別的作用:

   to: Route,代表要進入的目標,它是一個路由對象

  from: Route,代表當前正要離開的路由,同樣也是一個路由對象

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

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

   next(false):這代表中斷掉當前的導航,即 to 代表的路由對象不會進入,被中斷,此時該表 URL 地址會被重置到 from 路由對應的地址

  next(‘/’) 和 next({path: ‘/’}):在中斷掉當前導航的同時,跳轉到一個不同的地址

   next(error):如果傳入參數是一個 Error 實例,那么導航被終止的同時會將錯誤傳遞給 router.onError() 注冊過的回調

  注意:next 方法必須要調用,否則鈎子函數無法 resolved,不同於前置守衛,后置鈎子並沒有 next 函數,也不會改變導航本身。

 2. 路由獨享的鈎子

  顧名思義,即單個路由獨享的導航鈎子,它是在路由配置上直接進行定義的: beforeEnter

 1 cont router = new VueRouter({
 2     routes: [
 3         {
 4             path: '/file',
 5             component: File,
 6             beforeEnter: (to, from ,next) => {
 7                 // do someting
 8             }
 9         }
10     ]
11 });
12 // 至於他的參數的使用,和全局前置守衛是一樣的

 3. 組件內的導航鈎子 組件內的導航鈎子主要有這三種:

beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。他們是直接在路由組件內部直接進行定義的:

 1 const File = {
 2     template: `<div>This is file</div>`,
 3     beforeRouteEnter(to, from, next) {
 4         // do someting
 5         // 在渲染該組件的對應路由被 confirm 前調用
 6     },
 7     beforeRouteUpdate(to, from, next) {
 8         // do someting
 9         // 在當前路由改變,但是依然渲染該組件是調用
10     },
11     beforeRouteLeave(to, from ,next) {
12         // do someting
13         // 導航離開該組件的對應路由時被調用
14     }
15 }

需要注意是: beforeRouteEnter 不能獲取組件實例 this,因為當守衛執行前,組件實例被沒有被創建出來,剩下兩個鈎子則可以正常獲取組件實例 this 但是並不意味着在 beforeRouteEnter 中無法訪問組件實例,我們可以通過給 next 傳入一個回調來訪問組件實例。在導航被確認是,會執行這個回調,這時就可以訪問組件實例了,如:

1 beforeRouteEnter(to, from, next) {
2     next (vm => {
3         // 這里通過 vm 來訪問組件實例解決了沒有 this 的問題
4     })
5 }

 注意,僅僅是 beforRouteEnter 支持給 next 傳遞回調,其他兩個並不支持。因為歸根結底,支持回調是為了解決 this 問題,而其他兩個鈎子的 this 可以正確訪問到組件實例,所有沒有必要使用回調

 最后是完整的導航解析流程:

  1. 導航被觸發
  2. 在失活的組件里調用離開守衛
  3. 調用全局的 beforeEach 守衛
  4. 在重用的組件里調用 beforeRouteUpdate 守衛
  5. 在路由配置里調用 beforEnter
  6. 解析異步路由組件
  7. 在被激活的組件里調用 beforeRouteEnter
  8. 調用全局的 beforeResolve 守衛
  9. 導航被確認
  10. 調用全局的 afterEach 鈎子
  11. 觸發 DOM 更新
  12. 在創建好的實例調用 beforeRouteEnter 守衛中傳給 next 的回調函數

  

 


免責聲明!

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



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