vue的路由守衛,也叫路由鉤子、導航守衛或導航鉤子。路由(vue-router) 提供的導航守衛主要用來:通過跳轉或取消的方式守衛導航。有多種機會植入路由導航過程中:全局的,單個路由獨享的, 或者組件級的。
使用 router.beforeEach 註冊全局的前置路由守衛。
當壹個導航觸發時,全局前置守衛按照創建順序調用。守衛是異步解析執行,此時導航在所有守衛 resolve 完之前壹直處於等待中。
方法接收三個參數:
to: Route ,即將要進入的目標 路由對象
from: Route ,當前導航正要離開的路由
next: Function ,壹定要調用該方法來resolve這個鉤子。執行效果依賴 next 方法的調用參數。
? next(): 進行管道中的下壹個鉤子。如果全部鉤子執行完了,則導航的狀態就是confirmed (確認的)。
? next(false): 中斷當前的導航。如果瀏覽器的 URL 改變了 (可能是用戶手動或者瀏覽器後退按鈕),那麽 URL 地址會重置到 from 路由對應的地址。
? next('/') 或者 next({ path: '/' }): 跳轉到壹個不同的地址。當前的導航被中斷,然後進行壹個新的導航。妳可以向 next 傳遞任意位置對象,且允許設置諸如 replace: true、name: 'home' 之類的選項以及任何用在router-link的 to prop或 router.push中的選項。
? next(error): (2.4.0+) 如果傳入 next 的參數是壹個 Error 實例,則導航會被終止且該錯誤會被傳遞給 router.onError()註冊過的回調。
確保要調用 next方法,否則鉤子就不會被 resolved。
使用 router.afterEach 註冊全局的後置守衛。
不同於前置守衛的是,後置守衛沒有 next 函數,也不會改變導航本身。
這個是vue2.5.0版本新增的。使用 router.beforeReslolve 註冊全局的解析守衛。
這和 router.beforeEach 類似,區別在於:在導航被確認之前,同時在所有組件內守衛和異步路由組件被解析之後,解析守衛就被調用。
顧名思義,即單個路由獨享的導航鉤子,使用 boforeEnter 在路由配置上直接進行註冊。
使用方法與全局守衛相同,不同點在於:全局守衛可以作用於全局,路由獨享守衛只作用於被設置守衛的路由。
組件內的守衛分為 beforeRouteEnter 、 beforeRouterUpdate 和 beforeRouteLeave 。
在渲染該組件的對應路由被 confirm 前調用。
但是並不意味著在 beforeRouteEnter 中無法訪問組件實例,我們可以通過給 next 傳入壹個回調來訪問組件實例。在導航被確認時,會執行這個回調,這時就可以訪問組件實例了。
這個方法是vue-router2.2版本加上的。因為原來的版本中,如果壹個在兩個子路由之間跳轉,是不觸發beforeRouteLeave的。這會導致某些重置操作,沒地方觸發。在之前,我們都是用watch 的。但是通過這個鉤子,我們有了更好的方式。
這個離開守衛通常用來禁止用戶在還未保存修改前突然離開。該導航可以通過 next(false) 來取消。