### 有关于路由守卫中的钩子函数

发布时间 2023-04-04 10:38:03作者: 发霉的奶黄包

全局守卫:

vue-router全局有三个守卫

1.router.beforeEach全局前置守卫,进入路由之前

2.router.beforeResolve全局解析守卫,在beforeRouter调用之后调用

3.router.afterEach全局后置钩子 进入路由之后

to/from/next这三个参数:

to和from是将要进入和将要离开的路有对象,路由对象指的是平时通过this.$route获取到的路由对象

next:Function这个参数是个函数,当前的导航被中断,重新开始一个新的导航。

next()进入该路由。

next(false):取消进入路由,url地址重置为from路由地址(也就是即将要离开的路由地址)

next跳转新路由,当前的导航被中断,重新开始一个新的导航

我们可以这样跳转:next('path地址')或者next({"path:"})或者next({name:""})

且允许设置诸如replace:true name:‘home’之类的选项

以及你用在router-link或router.push的对象选项

路由组件内的守卫

1.beforeRouter进入路由之前

2.beforeRouteEnter路由复用同一个组件时

3.beforeRouteLeave离开当前路由时

beforeRouteEnter (to, from, next) {
// 在路由独享守卫后调用 不!能!获取组件实例 `this`,组件实例还没被创建
},
beforeRouteUpdate (to, from, next) {
// 在当前路由改变,但是该组件被复用时调用 可以访问组件实例 `this`
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
},
beforeRouteLeave (to, from, next) {
// 导航离开该组件的对应路由时调用,可以访问组件实例 `this`
}

beforeRouteEnter访问this

因为钩子在组件实例中还没被创建的时候调用,所以不能获取组件实例this,可以通过传一个回调给next来访问组件实例

但是回调的执行时机在mounted后面,所以在这里对this的调用访问意义不大,可以放在直接放在created或者mounted里面

beforeRouteLeave

导航离开该组件对应的路由时调用,我们用它来禁止用户离开,比如还未保存草稿,或者在用户离开之前,将setInterval销毁,防止离开以后,定时器还在调用

beforeRouteLeave (to, from , next) {
if (文章保存) {
next(); // 允许离开或者可以跳到别的路由 上面讲过了
} else {
next(false); // 取消离开
}
}