router进阶(router.beforeEach((to, from, next),router
文章正文
发布时间:2023-11-21 04:50
前言:之前写过vue-router的基本用法。这次写一篇router的进阶版。👉
全局守卫
全局守卫介绍
全局前置守卫(项目中都要用到) router.beforeEach( to,from,next ) =>{ } 全局解析守卫 router.beforeResolve( to,from,next ) =>{ } 全局后置守卫 router.afterEach( to,from )=>{ }
详解:👇
1、常用于登录验证;
2、使用 router.beforeEach 可注册一个全局前置守卫;
3、每当一个导航被触发时,首先被调用的总是全局前置守卫 ;
4、该守卫接受三个参数:to、from、next,三个参数意思分别是:
to:即将要进入的目标路由对象(路由对象)
form:当前导航正要离开的路由(路由对象)
next: 此方法,必须调用,如果想跳转的话,否则路由将不会跳转(方法)
router
.beforeEach((to,from,next)=>{
console
.log(to
)
console
.log(from
)
console
.log(next
)
next()
})
解析
to :是跳转后的目标路由对象
(例如:从 / index 跳转到 / router 那么to指代的就是后者对象);
from:是之前的路由对象 / index。
(form和to相反,指代的是前者)
next:则是一个函数,next函数决定路由是否跳转
(路由守卫里必用的一个方法,否则将不会进行下一步。)
next方法中可以传参数
next(参数)解释
next( false) 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是confirmed(确认的)。 next ( ’ / ’ ) next( ’ / ‘)或者next({ paht:’ / ’ }):跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。可传递的参数可以是router-link标签中的to属性参数或router.push中的选项 next( error ) next( error ):如果传入next的参数是一个Error实例,则导航会被终止且该错误会被传递给router.onError()注册过的回调。
全局解析守卫 router.beforeResolve( ( to,from,next)=>{ } )
官方文档:2.5.0新增的一个守卫,在导航被确认之前,同时在所有组件守卫和异步路由被解析之后(加载完之后),解析守卫会被调用。。。
全局后置钩子router.afterEach( ( to,from)=>{ } )
与守卫不同的是,此钩子函数不会接受next函数,也不会改变导航本身。。。是在全局解析守卫之后被调用。。。
路由专享守卫
const router
= new VueRouter({
routes: [
{
path: '/play',
component: Play
,
beforeEnter: (to, from, next) => {}
}
]
})
组件守卫
export default {
name:'router',
beforeRouteEnter(to,from,next){
// 在渲染组件前调用,不能获取this,组件实例还未被挂载
next()
},
beforeRouteUpdate(to,from,next){
// 在当前路由改变,但当前组件被复用时调用,
// 比如:带有动态参数的路径,/foo/1 跳转 /foo/2 时,
// 该钩子函数被调用。(可访问组件实例this)
next()
},
beforeRouteLeave(to,from,next){
// 离开该组件对应的路由时,该钩子函数会被调用
next()
}
}
beforeRouterEnter 守卫不能够访问this,因为守卫在导航确认前被掉用,即将登场的新组件还未被创建。
当然如果你非要在此守卫中用到this,官方也给出了一个方法,你可以在next函数中传一个回调函数,并把实例作为参数传到回调函数中去,这样您就可以使用this了。
export default {
name:'play',
beforeRouteEnter(to,from,next){
next((_this)=>{
// 通过 _this来访问实例
})
}
}
《官方提醒》
beforeRouterEnter是支持给next函数传递回调的唯一守卫;
对于beforeRouterUpdate守卫 和 beforeRouterLeave守卫来说,this已经可以用了,所以不支持传递回调,也没意义!!!