關於鉤子的一些知識
阿新 • • 發佈:2022-05-12
路由鉤子函式的錯誤捕獲
如果我們在全域性守衛/路由獨享守衛/元件路由守衛的鉤子函式中有錯誤,可以這樣捕獲:
router.onError(callback => {
// 2.4.0新增 並不常用,瞭解一下就可以了
console.log(callback, 'callback');
});
在路由文件中還有更多的例項方法:動態新增路由等,有興趣可以瞭解一下。
跳轉死迴圈,頁面永遠空白
我瞭解到的,很多人會碰到這個問題,來看一下這段虛擬碼:
router.beforeEach((to, from, next) => { if(登入){ next() }else{ next({ name: 'login' }); } });
看邏輯貌似是對的,但是當我們跳轉到login
之後,因為此時還是未登入狀態,所以會一直跳轉到login
然後死迴圈,頁面一直是空白的,所以:我們需要把判斷條件稍微改一下。
router.beforeEach((to, from, next) => {
if(登入){
next()
}else{
next({ name: 'login' });
}
});
看邏輯貌似是對的,但是當我們跳轉到login
之後,因為此時還是未登入狀態,所以會一直跳轉到login
然後死迴圈,頁面一直是空白的,所以:我們需要把判斷條件稍微改一下。
if(登入 || to.name === 'login'){ next() } // 登入,或者將要前往login頁面的時候,就允許進入路由
全域性後置鉤子的跳轉:
文件中提到因為router.afterEach不接受next
函式所以也不會改變導航本身,意思就是隻能當成一個鉤子來使用,但是我自己在試的時候發現,我們可以通過這種形式來實現跳轉:
// main.js 入口檔案 import router from './router'; // 引入路由 router.afterEach((to, from) => { if (未登入 && to.name !== 'login') { router.push({ name: 'login' }); // 跳轉login } });
完整的路由導航解析流程(不包括其他生命週期):
- 觸發進入其他路由。
- 呼叫要離開路由的元件守衛
beforeRouteLeave
- 呼叫局前置守衛:
beforeEach
- 在重用的元件裡呼叫
beforeRouteUpdate
- 呼叫路由獨享守衛
beforeEnter
。 - 解析非同步路由元件。
- 在將要進入的路由元件中呼叫
beforeRouteEnter
- 呼叫全域性解析守衛
beforeResolve
- 導航被確認。
- 呼叫全域性後置鉤子的
afterEach
鉤子。 - 觸發DOM更新(
mounted
)。 - 執行
beforeRouteEnter
守衛中傳給 next 的回撥函式