首页 > 其他分享 >Vue Router系列之(十二)路由守卫

Vue Router系列之(十二)路由守卫

时间:2024-02-29 20:00:45浏览次数:33  
标签:Vue 调用 next 守卫 meta 组件 Router 路由

路由守卫

  1. 作用:对路由进行权限控制,满足一定条件才能看到跳转到的路由组件

  2. 分类:全局守卫、独享守卫、组件内守卫

  3. 全局守卫:

    // src/router/index.js
    
    // router:我们创建的路由器实例
    // router.beforeEach(function):每一次进行路由跳转之前都会帮我们调用我们传入的函数
    //全局前置守卫:初始化【当前js文件被解析时,路由器的规则一加载的时候】时执行、每次路由切换前执行
    //to:目标路由的信息
    //from:当前所处路由的信息
    //next:放行
    router.beforeEach((to,from,next)=>{
    	console.log('beforeEach',to,from)
      	// 我们在进行鉴权时,并不是所有的路由组件都要进行鉴权,所以可以通过一个我们自定义的配置项,配置在路由规则中,只有这个配置项的值为true,才会进行鉴权。这里用到的自定义配置项就是isAuth
      	// isAuth是我们自定义的配置项,放在每个路由下面的meta配置项中
      	// meta:路由元信息
    	if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
    		if(localStorage.getItem('school') === 'atguigu'){ //权限控制的具体规则
    			next() //放行
    		}else{
    			alert('暂无权限查看')
    			// next({name:'guanyu'})
    		}
    	}else{
    		next() //放行
    	}
    })
    
    //全局后置守卫:初始化时执行、每次路由切换后【展示区中展示出该组件后,也就是成功进入到该组件后】执行
    //to:目标路由的信息
    //from:当前所处路由的信息
    router.afterEach((to,from)=>{
    	console.log('afterEach',to,from)
    	if(to.meta.title){ 
          	// 以下逻辑如果放到前置路由守卫中需要写多次
    		document.title = to.meta.title //根据每个路由中的meta.title修改网页的title
    	}else{
    		document.title = 'vue_test'
    	}
    })
    
  4. 独享路由守卫:只有独享前置路由守卫,没有独享后置路由守卫

    某一个路由单独享用的路由守卫

    执行时机:路由器匹配到此次的路由规则后,进入到组件之前

    // src/router/index.js
    const router =  new VueRouter({
    	routes:[
    		{
    			path:'/about',
    			component:About,
    			meta:{
    				title: '关于'
    			},
              	 // 配置在每个路由中
    			beforeEnter(to,from,next){
                  console.log('beforeEnter',to,from)
                  if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
                      if(localStorage.getItem('school') === 'atguigu'){
                          next()
                      }else{
                          alert('暂无权限查看')
                          // next({name:'guanyu'})
                      }
                  }else{
                      next()
                  }
              }
    		},
    	]
    })
    
  5. 组件内路由守卫:

    // 配置在每个路由组件中,位置与生命周期函数同级
    
    //进入守卫:通过路由规则【直接在其他组件中写当前组件(beforeRouteEnter所在的组件)的标签是不会触发该方法的调用的】,进入该组件时被调用【比如当前是在其他组件的,此时点击了当前组件的导航项,路由器匹配到路由进入该组件之前,该方法就要被调用了,会在mounted钩子执行前调用】
    beforeRouteEnter (to, from, next) {
    	// 如果不调用next()是不能进入到当前组件的  
    },
    //离开守卫:通过路由规则,离开该组件时被调用【比如当前是在该组件的,此时点击了另一个导航项,该方法就要被调用了】
    beforeRouteLeave (to, from, next) {
    	// 如果不调用next()是不能从当前组件离开的  
    }
    

​ 路由组件切换后,前置路由守卫和后置路由守卫就都执行结束了,而beforeRouteLeave是从当前路由再切走时,beforeRouteLeave才会调用

各种路由守卫的执行时机及执行顺序

标签:Vue,调用,next,守卫,meta,组件,Router,路由
From: https://www.cnblogs.com/wzzzj/p/18040067

相关文章

  • Vue CLI 系列之(十)webStorage
    webStorage【浏览器本地存储】localStorage和sessionStorage统称为webStorage1.localStorage未登录账号的情况下进行了商品搜索,搜索历史中保存了之前的搜索记录借助浏览器的本地存储可以将数据存到硬盘上,用于缓存数据通过浏览器如何查看浏览器本地存储​ 每个网站都有自己......
  • Vue CLI 系列之(十四)$nextTick
    $nextTick$nextTick这也是一个生命周期​ 如果要实现一个input框点击后进行一些数据修改的操作【这里是指能够引起Vue重新解析模板的数据修改操作,比如修改data中的数据】,然后让该input框获取焦点,该怎么做?//Item组件中有一个input输入框和一个编辑按钮,实现点击按钮后input框显......
  • Vue CLI 系列之(十三)消息订阅与发布
    消息订阅与发布【pubsub】1.理解消息订阅与发布2.原理图​ 通过报纸的订阅与发布来理解就是:A去C那订阅了报纸demo,并说明了自己的住址test,由于test是定义在A中的,而A又把test的引用提供出来了,这样C只要一调用test,自动就来到了A这,也就找到了A住的地儿,C发布test报纸时携带的内......
  • Vue CLI 系列之(十二)全局事件总线
    全局事件总线【GlobalEventBus】......
  • Vue CLI 系列之(十一)组件自定义事件
    组件自定义事件区别于js内置事件,内置事件是给html元素用的,而自定义事件是给组件用的1.给组件实例对象绑定自定义事件给组件绑定自定义事件v-on:自定义事件名="回调函数"比如:<Studentv-on:atguigu="demo"/>上面代码的含义为:由于v-on是在Student这个组件标签上,所以是给stu......
  • Vue CLI 系列之(十五)过渡与动画
    过渡与动画Vue封装的过渡与动画1.前置知识CSS3动画【2D转换、3D转换、过渡、动画】参考网站:https://www.runoob.com/css3/css3-animations.html<h1v-show="isShow"id="title">显示了</h1><style> h1{ /*通过animation把"donghua"动画捆绑到h1元素,时长:1......
  • Vue 2x 系列之(十五)过滤器
    过滤器BootCDN:包含了一些免费、优秀的第三方类库官网:https://www.bootcdn.cn/moment.js:js的日期处理类库dayjs:moment.js的轻量化解决方案,API同moment.js完全一致引入dayjs,全局就多了一个dayjs()函数,dayjs()函数默认解析当前时间的时间戳,也可传入时间戳进行解析注:过滤器相对......
  • Vue 2x 系列之(十七)自定义指令
    自定义指令从某种程度上来说,Vue中的自定义指令就是把原生DOM操作进行了一次封装指令是不能脱离元素【标签】存在的定义指令:big使用指令:v-big值的写法:对象【可以处理一些细节上的问题】和函数定义指令可以通过两种方式,函数式和对象式1.函数式指令名(真实DOM元素[element],......
  • Vue 2x 系列之(十六)内置指令
    内置指令我们学过的指令: v-bind :单向绑定解析表达式,可简写为:xxx v-model :双向数据绑定 v-for :遍历数组/对象/字符串 v-on :绑定事件监听,可简写为@ v-if :条件渲染(动态控制节点是否存存在) v-else :条件渲染(动态控制节点是否存存在) v-show :......
  • Vue 2x 系列之(十九)Vue组件化编程
    Vue组件化编程一、对组件的理解什么是组件?组件的定义:​ 实现应用中局部【组件要拆的尽量细致】功能代码【对于前端来说,就是css+html+js】和资源【mp3、mp4、ttf、.zip...】的集合【组件是一个集合】与传统方式编程相比,组件化编程有什么优势?依赖关系不混乱、好维护、代码......