Vue的路由守卫

全局守卫

写在router的js文件下边(不是单独的某个路由里边)

1、全局前置钩子router.beforeEach(fn),导航被触发----一般登录验证

2、全局解析钩子router.beforeResolve(fn),组件初始化

3、全局后置钩子router.afterEach(fn),没有next,导航被确认,一般路由跳转以后用window把窗口调上去

  fn为回调函数,该回调函数一般都有三个形参to,from,next

to表示跳转的路由,from表示当前页面的路由,next是执行跳转到哪个路由

router.beforeEach(fn)一般用于过滤路由,如判断是否登录

//全局前置守卫
router.beforeEach((to, from, next) => {
	//用户未登录只能访问首页、登录注册页面
	if (to.path == "/" || to.path == "/login" || to.path == "/register") {
		next();
	} else {
		//去其他页面判断是否登录
		let flag = window.localStorage.getItem("email");
		//登录过直接放行
		if (flag) {
			next()
		} else {
			//未登录则跳转到首页
			Message({
				message: '您尚未登录哦,请先登录!',
				type: 'warning',
				duration: 1500
			});
			next("/");
		}
	}
})

router.afterEach(fn)

应用场景:如用于解决跳转路由时,跳转路由的界面并不是在该面顶部的一个小bug

router.afterEach((to, from) => {
  window.scrollTo(0,0)
})

独享守卫

单独写在某个注册路由里边

路由独享的守卫beforeEnter(to,from,next),路由初始化(组件未初始化)----

a,路由鉴权-----用户体验:界面,功能,bug,效率,权限

b,组件异步加载情景中(插件配置:syntax-dynamic-import)

routes:[{
    path:"/test",
    component:()=>import("../components/Test.vue"),
    beforeEnter(to,from,next){
        if(to.path==="/test"){
          alert("请登录");
          next(false); // 禁止跳转
        }else{
          next()
        }
 	}
}]

组件内部生命周期守卫

beforeRouteLeave 从该组件离开

beforeRouteEnter(to,from,next),组件被激活,使用不了this,故构造指定该next 可以接收一个回调函数接收当前vm 实例----路由传参获取参数,得到初始化数据

beforeRouteUpdate(to,from,next),组件重用时被调用----路由传参获取参数,避免增添watch 开销

总结

导航守卫执行顺序:beforeRouteLeave < beforeEach < beforeRouteUpdate < beforeEnter < beforeRouteEnter < beforeResolve < afterEach

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值