文章目录

  • 10.13路由守卫
    • 案例:将案例改为“使用独享路由守卫”
    • 完整代码
  • 本人其他相关文章链接

10.13路由守卫



注意点1:
前置路由守卫或者后置路由守卫中,to指代切换到哪个路由组件,from指代从哪里来的路由组件,next指代下一个路由组件是否放行显示

注意点2:
如果想实现路由组件的to属性添加自定义属性用于权限判断,必须放在meta元数据属性中,meta就是用来存放自定义属性的,比如代码中的to.meta.isAuth,其中isAuth就是用来判断当前路由组件是否用于授权校验。

注意点3:

问题:判断路由组件是否需要鉴权,为啥不使用name属性,而要自定义isAuth属性?

答案:如果使用name属性,那么if条件判断就要写好多好多的判断,而使用isAuth属性就简单方便许多。

使用name属性

if(to.name === ‘xinwen’ || to.name === ‘xiaoxi’ || to.name === ‘xiangqing’){ //判断是否需要鉴权

使用isAuth属性

if(to.meta.isAuth){ //判断是否需要鉴权

注意点4:
如果想使用全局前置/后置路由守卫,路由配置文件index.js中不能直接暴露不然无法生效,要创建一个路由并配置鉴权规则后再暴露

错误写法:

//创建并暴露一个路由器
export default new VueRouter({...
})

正确写法:

//创建并暴露一个路由器
const router =  new VueRouter({...
})//全局前置路由守卫————初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to,from,next)=>{...
})//全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{...
})export default router

注意点5:

问题:独享路由守卫是啥?

答案:就是某一个路由单独享有的路由守卫

注意点6:
只有前置独享路由守卫,没有后置。

注意点7:

问题:组件内路由守卫是啥?

答案:就是在单个组件内定义些路由守卫的东西。

注意点8:

问题:组件内路由守卫可以理解为前置和后置路由守卫吗?

答案:不能。
区别点1:因为组件内路由守卫,指代进入该组件和离开该组件时使用,强调“进入和离开”的动作,而全局路由守卫才强调“前置和后置”的动作。
区别点2:全局路由守卫的前置/后置,都会执行,而组件内路由守卫beforeRouteEnter一定会执行,但如果不离开,那么beforeRouteLeave就不会执行。

案例:将案例改为“使用独享路由守卫”

要求:home和about路由组件可以随意展示,而news和message路由组件需要判断缓存中key为school,value的值是否为atguigu,是则放行,不是则弹窗提示无权限;同时切换路由组件是title标题也进行切换。

改动的地方只在路由配置文件index.js中配置独享路由守卫。

name:'xinwen',
path:'news',
component:News,
meta:{isAuth:true,title:'新闻'},
beforeEnter: (to, from, next) => {console.log('独享路由守卫',to,from)if(to.meta.isAuth){ //判断是否需要鉴权if(localStorage.getItem('school')==='atguigu'){next()}else{alert('学校名不对,无权限查看!')}}else{next()}
}

完整代码

完整项目路径

main.js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//引入VueRouter
import VueRouter from 'vue-router'
//引入路由器
import router from './router'//关闭Vue的生产提示
Vue.config.productionTip = false
//应用插件
Vue.use(VueRouter)//创建vm
new Vue({el:'#app',render: h => h(App),router:router
})

App.vue

<template><div><div class="row"><Banner/></div><div class="row"><div class="col-xs-2 col-xs-offset-2"><div class="list-group"><!-- 原始html中我们使用a标签实现页面的跳转 --><!-- <a class="list-group-item active" href="./about.html">About</a> --><!-- <a class="list-group-item" href="./home.html">Home</a> --><!-- Vue中借助router-link标签实现路由的切换 --><router-link class="list-group-item" active-class="active" to="/about">About</router-link><router-link class="list-group-item" active-class="active" to="/home">Home</router-link></div></div><div class="col-xs-6"><div class="panel"><div class="panel-body"><!-- 指定组件的呈现位置 --><router-view></router-view></div></div></div></div></div>
</template><script>import Banner from './components/Banner'export default {name:'App',components:{Banner}}
</script>

index.js

// 该文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
//引入组件
import About from '../pages/About'
import Home from '../pages/Home'
import News from '../pages/News'
import Message from '../pages/Message'
import Detail from '../pages/Detail'//创建并暴露一个路由器
const router =  new VueRouter({routes:[{name:'guanyu',path:'/about',component:About,meta:{title:'关于'}},{name:'zhuye',path:'/home',component:Home,meta:{title:'主页'},children:[{name:'xinwen',path:'news',component:News,meta:{isAuth:true,title:'新闻'},beforeEnter: (to, from, next) => {console.log('独享路由守卫',to,from)if(to.meta.isAuth){ //判断是否需要鉴权if(localStorage.getItem('school')==='atguigu'){next()}else{alert('学校名不对,无权限查看!')}}else{next()}}},{name:'xiaoxi',path:'message',component:Message,meta:{isAuth:true,title:'消息'},children:[{name:'xiangqing',path:'detail',component:Detail,meta:{isAuth:true,title:'详情'},//props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件。// props:{a:1,b:'hello'}//props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件。// props:true//props的第三种写法,值为函数props($route){return {id:$route.query.id,title:$route.query.title,a:1,b:'hello'}}}]}]}]
})//全局前置路由守卫————初始化的时候被调用、每次路由切换之前被调用
/* router.beforeEach((to,from,next)=>{console.log('前置路由守卫',to,from)if(to.meta.isAuth){ //判断是否需要鉴权if(localStorage.getItem('school')==='atguigu'){next()}else{alert('学校名不对,无权限查看!')}}else{next()}
}) *///全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{console.log('后置路由守卫',to,from)document.title = to.meta.title || '硅谷系统'
})export default router

About.vue

<template><h2>我是About的内容</h2>
</template><script>export default {name:'About',/* beforeDestroy() {console.log('About组件即将被销毁了')},*//* mounted() {console.log('About组件挂载完毕了',this)window.aboutRoute = this.$routewindow.aboutRouter = this.$router},  */}
</script>

Home.vue

<template><div><h2>Home组件内容</h2><div><ul class="nav nav-tabs"><li><router-link class="list-group-item" active-class="active" to="/home/news">News</router-link></li><li><router-link class="list-group-item" active-class="active" to="/home/message">Message</router-link></li></ul><!-- 缓存多个路由组件 --><!-- <keep-alive :include="['News','Message']"> --><!-- 缓存一个路由组件 --><keep-alive include="News"><router-view></router-view></keep-alive></div></div>
</template><script>export default {name:'Home',/* beforeDestroy() {console.log('Home组件即将被销毁了')}, *//* mounted() {console.log('Home组件挂载完毕了',this)window.homeRoute = this.$routewindow.homeRouter = this.$router},  */}
</script>

News.vue

<template><ul><li :style="{opacity}">欢迎学习Vue</li><li>news001 <input type="text"></li><li>news002 <input type="text"></li><li>news003 <input type="text"></li></ul>
</template><script>export default {name:'News',data() {return {opacity:1}},// beforeDestroy() {//     console.log('News组件即将被销毁了')//     clearInterval(this.timer)// },// mounted(){//   this.timer = setInterval(() => {//         console.log('@')//       this.opacity -= 0.01//         if(this.opacity <= 0) this.opacity = 1//   },16)// },activated() {console.log('News组件被激活了')this.timer = setInterval(() => {console.log('@')this.opacity -= 0.01if(this.opacity <= 0) this.opacity = 1},16)},deactivated() {console.log('News组件失活了')clearInterval(this.timer)},}
</script>

Message.vue

<template><div><ul><li v-for="m in messageList" :key="m.id"><!-- 跳转路由并携带params参数,to的字符串写法 --><!-- <router-link :to="`/home/message/detail/${m.id}/${m.title}`">{{m.title}}</router-link>&nbsp;&nbsp; --><!-- 跳转路由并携带params参数,to的对象写法 --><router-link :to="{name:'xiangqing',query:{id:m.id,title:m.title}}">{{m.title}}</router-link><button @click="pushShow(m)">push查看</button><button @click="replaceShow(m)">replace查看</button></li></ul><hr><router-view></router-view></div>
</template><script>export default {name:'Message',data() {return {messageList:[{id:'001',title:'消息001'},{id:'002',title:'消息002'},{id:'003',title:'消息003'}]}},methods: {pushShow(m){this.$router.push({name:'xiangqing',query:{id:m.id,title:m.title}})},replaceShow(m){this.$router.replace({name:'xiangqing',query:{id:m.id,title:m.title}})}},beforeDestroy() {console.log('Message组件即将被销毁了')},}
</script>

Detail.vue

<template><ul><li>消息编号:{{id}}</li><li>消息标题:{{title}}</li></ul>
</template><script>export default {name:'Detail',props:['id','title'],computed: {// id(){//   return this.$route.query.id// },// title(){//   return this.$route.query.title// },},mounted() {// console.log(this.$route)},}
</script>

Banner.vue

<template><div class="col-xs-offset-2 col-xs-8"><div class="page-header"><h2>Vue Router Demo</h2><button @click="back">后退</button><button @click="forward">前进</button><button @click="test">测试一下go</button></div></div>
</template><script>export default {name:'Banner',methods: {back(){this.$router.back()// console.log(this.$router)},forward(){this.$router.forward()},test(){this.$router.go(3)}},}
</script>

Index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1.0"><link rel="icon" href="<%= BASE_URL %>favicon.ico"><title>硅谷系统</title>
<link rel="stylesheet" href="<%= BASE_URL %>css/bootstrap.css"></head><body><noscript><strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body>
</html>

bootstrap.css网上搜一个拷贝进来,这个上前行代码就不拷贝过来了

结果展示:

本人其他相关文章链接

1.《vue2进阶篇:路由》第10章:vue-router,包括基础路由、嵌套路由、路由的query参数和params参数、命名路由、router-link的replace属性、编程式路由、缓存路由组件
2.vue2进阶篇:安装路由
3.vue2进阶篇:vue-router之基础路由
4.vue2进阶篇:vue-router之嵌套(多级)路由
5.vue2进阶篇:vue-router之路由的query参数
6.vue2进阶篇:vue-router之命名路由
7.vue2进阶篇:vue-router之路由的params参数
8.vue2进阶篇:vue-router之路由的props配置
9.vue2进阶篇:vue-router之router-link的replace属性
10.vue2进阶篇:vue-router之编程式路由导航
11.vue2进阶篇:vue-router之缓存路由组件
12.vue2进阶篇:vue-router之两个新的生命周期钩子
13.vue2进阶篇:vue-router之使用“全局路由守卫”
14.vue2进阶篇:vue-router之“使用独享路由守卫”
15.vue2进阶篇:vue-router之“使用组件内路由守卫”
16.vue2进阶篇:vue-router之路由的2种工作模式

vue2进阶篇:vue-router之“使用独享路由守卫”相关推荐

  1. 独享路由守卫beforeEnter

    我们都知道vue中有全局的路由守卫: beforeEach在任何导航前执行.返回一个删除已注册守卫的函数.和afterEach 事实上在vue中还有 一个 独享路由守卫: beforeEnter:在进 ...

  2. vue 独享路由守卫

    要点: 在路由规则里直接配置beforeEnter 为独享路由守卫 ,只对xinwei有权限控制 注意独享路由守卫只有前置,没有后置!!!!!!!!!!!!!!! 要完成后置就可以配置全局的后置路由守 ...

  3. 全局路由守卫,独享路由守卫,组件内路由守卫

    路由守卫: 1.作用:对路由进行权限控制 2.分类:全局路由守卫,独享路由守卫,组件内路由守卫 3.全局路由守卫:在router=>index.js const routes =[ {path: ...

  4. Vue Router系列之详解路由守卫

    文章の目录 1.路由守卫是什么 2.导航守卫分类 2.1.全局守卫 2.1.1.全局前置守卫beforeEach 2.1.2.全局解析守卫beforeResolve(2.5.0 新增) 2.1.3.全 ...

  5. vue2进阶篇:vue-router之路由的2种工作模式

    文章目录 10.14路由的2种工作模式 本人其他相关文章链接 10.14路由的2种工作模式 注意点1: 问题:路由的2种工作模式 答案:hash模式和history模式.其中hash模式就是url路径 ...

  6. vue2进阶篇:vue-router之路由的params参数

    文章目录 10.7路由的params参数 案例:将案例改为"路由的params参数" 完整代码 本人其他相关文章链接 10.7路由的params参数 注意点1: 跳转路由并携带pa ...

  7. vue router返回到指定的路由

    vue router返回到指定的路由 一.项目场景 二.问题描述 三.原因分析 四.解决方案 一.项目场景 项目场景:示例:A(商品详情)--B(商品购买页面)-C(支付成功页面)--D(订单页面) ...

  8. vue router连续点击多次路由报错根本原因和解决方法

    原因: vue-router 升级到 3.1.x 后,重复点击导航时,控制台出现报错 ,vue router ≥ v3.1 后 ,回调形式改成 promise api 了,返回的是 promise,如 ...

  9. Vue源码 Vue Router(三)matcher 路由匹配器

    Vue源码 Vue Router(三)matcher Vue源码 Vue Router(三)matcher matcher createMatcher addRoutes match 总结 单步调试参 ...

最新文章

  1. 展望2018:WebRTC大规模商用元年
  2. objective-c对NSArray的学习
  3. 指针数组的初始化和遍历,并且通过for循环方式、函数传参方式进行指针数组的遍历...
  4. Python简单试题3
  5. java 中parse_Java中parse()和valueOf(),toString()的区别?
  6. 简单Linux磁盘管理
  7. python文件打开的合法方式-用python与文件进行交互的方法
  8. [原]敏捷开发-项目启动
  9. OAuth2.0学习(1-12)开源的OAuth2.0项目和比较
  10. 6种微服务RPC框架,你知道几个?
  11. 百度网盘内容提取网站
  12. js如何获取当月第一天和最后一天
  13. 外汇EA是什么?外汇EA有什么用呢?能赚钱吗?
  14. u盘如何安装xp和linux,怎样从U盘安装Windows XP?
  15. 树莓派开机不加载桌面全屏启动chromium浏览器
  16. EtherCAT--01简介
  17. 电脑壁纸该换了,mac必备壁纸软件Dynamic Wallpaper
  18. 圆的周长面积(YZOJ-1020)
  19. 当当活动 | 先读书,后浪
  20. Java开源项目部署在99元阿里云centos8上

热门文章

  1. web前端设计a half链接使用
  2. HTML5期末大作业:日式料理网站设计——简洁日式料理餐饮(4页) HTML+CSS+JavaScript 父亲美食HTM5网页设计作业成品
  3. php转域,转php姓名
  4. 机器学习(一) 机器学习概述
  5. PMP 考试一定要报培训班吗?
  6. 掉发不是病,秃起来真要命!作为程序猿的你,脱发了吗?
  7. MySQL深入了解与性能优化
  8. 用Shader Graph的Flipbook节点实现水花效果
  9. Python实现王者荣耀小助手(二)
  10. 中秋佳节,实现一个自定义任意路径嫦娥奔月程序:过什么节,代码走起