Vue.js中的路由導航鉤子(Navigation Guards)主要用于在路由導航過程中進行攔截和處理,確保訪問控制和狀態管理。以下是主要分類及使用方法:
1. 全局鉤子函數
作用于整個路由實例,需在路由配置外定義:
beforeEach
:在導航開始時執行,用于全局權限校驗(如登錄驗證)。
示例代碼:router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !isAuthenticated) {next('/login'); // 重定向到登錄頁} else {next(); // 繼續導航} });
beforeResolve
:在所有組件內守衛和異步路由解析后觸發,適用于需等待數據加載的場景。afterEach
:導航結束后調用,無next
參數,常用于日志記錄或頁面追蹤。
示例:router.afterEach((to, from) => {console.log(`Navigated to: ${to.path}`); });
2. 路由獨享守衛
在單個路由配置中定義,僅對特定路由生效:
beforeEnter
:在進入該路由前執行,參數與beforeEach
一致。
示例代碼:const routes = [{path: '/user/:id',component: User,beforeEnter: (to, from, next) => {if (!checkPermission(to.params.id)) {next('/denied'); // 權限不足時攔截} else {next();}}} ];
3. 組件內鉤子
直接在Vue組件中定義,控制組件級導航邏輯:
beforeRouteEnter
:進入路由前調用,此時組件實例未創建,無法訪問this
,但可通過next(vm => {})
訪問實例。
示例代碼:export default {beforeRouteEnter(to, from, next) {next(vm => {vm.fetchData(); // 進入后初始化數據});} };
beforeRouteUpdate
:當前路由參數變化時觸發(如/user/1
到/user/2
),用于響應式更新數據。beforeRouteLeave
:離開路由前調用,防止用戶誤操作丟失數據(如未保存表單)。
示例:export default {beforeRouteLeave(to, from, next) {if (this.hasUnsavedChanges) {if (confirm('數據未保存,確認離開?')) next();else next(false); // 取消導航} else next();} };
關鍵使用原則
- 順序執行:鉤子按“全局 → 獨享 → 組件內”順序觸發,
next()
必須調用以繼續或終止導航。 - 參數說明:
to
:目標路由對象。from
:當前路由對象。next
:控制導航流程的方法(next()
放行,next(false)
終止,next(path)
重定向)。
- 避免阻塞:確保鉤子邏輯簡潔,避免長時間異步操作阻塞渲染。
這些鉤子靈活集成于Vue Router,可實現細粒度的路由控制。