路由守卫

227 阅读3分钟

路由守卫

作用:对路由进行权限控制

分类:全局守卫,独享守卫,组件内守卫

全局守卫

全局守卫指路由实例上直接操作的钩子函数,其特点是所有路由配置中路由地址注册的组件都会触发。

全局前置钩子router.beforeEach((to, from, next) => {}),在路由跳转前触发,这个钩子作用主要是用于登录验证,也就是路由还没跳转提前告知。该钩子函数初始化时会被调用以及每次路由切换之前被调用。

1.to:即将要进入的目标路由对象(to是一个对象,是将要进入的路由对象,可以用to.path访问路由对象中的属性)

2.from: 当前正要离开的路由对象

3.next: 这是一个必须需要调用的方法,决定是否渲染路由地址的组件。执行next(),展示当前界面

window.localStorage.getItem("key")取出的value是字符串类型

router.beforeEach((to, from, next) => {
	//用户未登录只能访问首页、登录注册页面
	if (to.path == "/" || to.path == "/login" || to.path == "/register") {
		next();
	} else {
		//去其他页面判断是否登录
		let flag = window.localStorage.getItem("email");
		//登录过直接放行
		if (flag=='true') {
			next()
		} else {
			//未登录则跳转到首页
			next("/");
		}
	}
})

next('/') 或者 next({ path: '/' })表示跳转到一个该路由地址的组件。意思是当前的导航被中断,然后进行一个新的导航。可传递的参数与router.push中选项一致。

全局解析钩子router.beforeResolve(to,from,next)=>{}),组件初始化。路由匹配完毕时调用

全局后置钩子router.afterEach((to,from)=>{}),是路由跳转之后执行的事件,可以用作跳转路由后更改网页名以及路由跳转以后用window把窗口滚动到顶部。该钩子函数初始化时会被调用以及每次路由切换之后被调用。

1.to:将要进入的路由对象

2.from:当前正要离开的路由对象

//全局后置守卫
router.afterEach((to, from) => {
  window.scrollTo(0,0)
})

//首先路由地址注册时的meta需要配置title的名字
 {
        path: '/',
        name: 'Home',
        component: () => import('../views/Home.vue'),
        meta: {title:'主页' },
    },

//全局后置路由守卫
router.afterEach((to, from) => {
    document.title = to.meta.title || '默认名'    //修改网页的title
})

独享守卫

路由独享的守卫beforeEnter((to,from,next)=>{}),路由初始化但是组件未初始化。某一个路由所单独享用的路由守卫,独享路由守卫只有前置没有后置。


    {
        path: '/',
        name: 'Home',
        component: () => import('../views/Home.vue'),
        beforeEnter(to, from, next){
             if (localStorage.getItem('school') === 'jessicaland') {
                    next()  //放行
                } else {
                    alert('抱歉,您无权限查看!')
                }
            } 
        }

组件内守卫

直接写在.vue组件文件中

//通过路由规则,进入该组件时被调用
beforeRouteEnter(to,from,next) { if(localStorage.getTime('school')==='jessicaland'){
      next(vm=>{
            alert("hello" + vm.name);
        })
    }else{
      alert('学校名不对,无权限查看!')
    }
  
},
 
//通过路由规则,离开该组件时被调用 
beforeRouteLeave(to,from,next) {
 next();
 next(false);//进制跳转,留在当前页面。
}

beforeRouteEnter(to,from,next){},组件被激活,使用不了this,故构造指定该next 可以接收一个回调函数接收当前vm 实例

beforeRouteUpdate(to,from,next){},在当前路由改变时,并且该组件被复用时调用,可以通过this访问实例。比如对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,组件实例会被复用,该守卫会被调用。

导航守卫执行顺序

当点击切换路由时,beforeRouterLeave-->beforeEach-->beforeRouteUpdate-->beforeEnter-->beforeRouteEnter-->beforeResolve-->afterEach-->beforeCreate-->created-->beforeMount-->mounted-->beforeRouteEnter的next的回调

出发路由预备从当前组件离开,判断路由变化,判断组件是否重用,判断新路由初始化,判断组件初始化,路由与组件初始化完毕,路由组件重定向完毕.