Vue生態圈之----vue-router----導航守衛
阿新 • • 發佈:2020-07-22
引數或查詢的改變並不會觸發進入/離開的導航守衛
全域性的
全域性前置守衛
當一個導航觸發時,全域性前置守衛按照建立順序呼叫。守衛是非同步解析執行,此時導航在所有守衛 resolve 完之前一直處於 等待中。
router.beforeEach((to, from, next) => {if (to.name !== 'Login' && !isAuthenticated) {
})
next({ name: 'Login' })
}else{
next()
}
-
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()
註冊過的回撥。
-
全域性解析守衛
在導航被確認之前,同時在所有元件內守衛和非同步路由元件被解析之後,解析守衛就被呼叫。
router.beforeResolve ((to, from, next) => { // ... })
全域性後置鉤子
和守衛不同的是,這些鉤子不會接受 next
router.afterEach((to, from) => { // ... })
單個路由獨享的
可以在路由配置上直接定義 beforeEnter
守衛
const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, beforeEnter: (to, from, next) => { // ... } } ] })
元件級的
可以在路由元件內直接定義以下路由導航守衛
const Foo = { template: `...`, beforeRouteEnter (to, from, next) { // 在渲染該元件的對應路由被 confirm 前呼叫 // 不!能!獲取元件例項 `this` // 因為當守衛執行前,元件例項還沒被建立
// 但是,可以通過傳一個回撥給next
來訪問元件例項
next(vm => {
}, beforeRouteUpdate (to, from, next) { // 在當前路由改變,但是該元件被複用時呼叫 // 舉例來說,對於一個帶有動態引數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候, // 由於會渲染同樣的 Foo 元件,因此元件例項會被複用。而這個鉤子就會在這個情況下被呼叫。 // 可以訪問元件例項 `this` }, beforeRouteLeave (to, from, next) { // 導航離開該元件的對應路由時呼叫 // 可以訪問元件例項 `this` } }
// 通過 `vm` 訪問元件例項
})
// 注意beforeRouteEnter
是支援給next
傳遞迴調的唯一守衛