导航守卫是用取消或者通过的方式来守卫导航,导航守卫有全局的 页面级的组件级的
- 导航些带的参数发生变化的时候导航守卫是不会进行监听的如果需要观察数据的变化,需要观察
$router
的变化 或者 使用beforeRouterUpdata的组件守卫
全局守卫
- 使用router.beforeEach 注册一个全局的路由守卫
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
// ...
})
- 当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。
-
to:Route:
即将要进入的目标 路由对象 -
from:Router:
当前导航正要离开的路由 -
nexFunction:一定要调用该方法来 resolve 这个钩子。
执行效果依赖 next 方法的调用参数。
1 next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
2 next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
3next('/')
或者next({ path: '/' })
: 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向next
传递任意位置对象,且允许设置诸如replace: true
、name: 'home'
之类的选项以及任何用在router-link
的to
prop 或router.push
中的选项。
全局后置钩子 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`
// 因为当守卫执行前,组件实例还没被创建
},
beforeRouteUpdate (to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
},
beforeRouteLeave (to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
}
}
- 在组件守卫beforeEnter()的时候还不能获取区组件的实例因为新的组件实例还没被调用所以无法获取this
但是了可以通过回调函数的vm实例来获区而且beforeEnter是唯一个支持给nex传递回调的函数
beforeRouteEnter (to, from, next) {
next(vm => {
// 通过 `vm` 访问组件实例
})
}
beforeRouteUpdate (to, from, next) {
// just use `this`
this.name = to.params.name
next()
}
路由meta字段
const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
children: [
{
path: 'bar',
component: Bar,
// a meta field
meta: { requiresAuth: true }
}
]
}
]
})