当前位置: 首页 > news >正文

[Vue3] vue-router路由守卫进阶

路由守卫,可以想象为古代御前侍卫,路由守卫,则是对路由进行权限控制

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

文章目录

      • 1.全局前置-路由守卫
      • 2.全局后置守卫
      • 3.独享守卫
      • 4.组件内路由守卫
      • 5.keep-alive遇见vue-router
      • 6.路由器的两种工作模式,history模式与hash模式

1.全局前置-路由守卫

作用:主要用来鉴权
用户点击导航区,随后引起路径的改变,前端路由器监测到,进行规则的匹配,在合适的位置呈现组件。

调用时机:初始化时被调用,每次路由切换之前调用

写法:

router.beforeEach((to, from, next) => {// 判断当前路由是否需要进行权限控制if (to.meta.isAuth) {// 权限控制规则if (localStorage.getItem('token')) {next() // 放行}} else if (to.path == '/home') {next()} else {console.log('暂无权限')}
})

to:即将要进入的目标路由对象
from:当前导航即将要离开的路由对象
next:调用该方法后,才能进入下一个钩子

2.全局后置守卫

主要作用:变更页签标题
调用时机:初始化被调用,每次路由切换之后调用

router.afterEach((to, from) => {document.title = to.meta.title
})

可以在钩子当中定义一些标题,利用meta来定义

const routes = [{path:'/index',component:Home,meta:{title:"首页"}},{path:"/about",component:About,meta:{title:"关于"}}
]
// 利用导航守卫。修改我们的标题
router.afterEach((to, from) => {document.title = to.meta.title
})

3.独享守卫

对某一个路由单独进行控制的守卫


const routes = [{path: "/system",name: "System",component: () => import(/* webpackChunkName: "system" */ "@/views/System"),beforeEnter: (to, from, next) => {if(to.meta.isAuth) {if(localStorage.getItem("token")){next()}} else {console.log("暂无权限");}}},
]

4.组件内路由守卫

beforeRouteEnter、beforeRouteLeave

调用时机:通过路由规则,beforeRouteEnter进入该组件时被调用,beforeRouteLeave离开该组件时被调用

// 进入守卫,通过路由规则,进入该组件时被调用
beforeRouteEnter(to, from,next){},
// 进入守卫,通过路由规则,离开该组件时被调用
beforeRouteLeave(to,from,next){}

5.keep-alive遇见vue-router

keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态或避免重新渲染

  • include:字符串或正则表达,只有匹配的组件会被缓存
  • exclude:字符串或正则表达式,匹配的组件都不会被缓存

router-view也是一个组件,如果直接被包在keep-alive里面,所有路径匹配的视图组件都会被缓存

<keep-alive><router-view>// 所有路径匹配到的视图组件会被缓存</router-view>
</keep-alive>

6.路由器的两种工作模式,history模式与hash模式

hash模式:

  1. 地址永远带着#号,不美观

  2. 如果以后将地址通过第三方手机app分享,app校验严格,则地址会被标记为不合法

  3. 兼容性好。

history模式:

  1. 这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

  2. 当你使用 history 模式时,URL 就像正常的 url,例如 http://yoursite.com/user/id

  3. 不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://oursite.com/user/id 就会返回 404。

  4. 地址干净,美观

  5. 兼容性和hash模式相比略差,IE9不兼容(可使用强制刷新处理)

  6. 应用部署上线时,需要后端人员支持,解决刷新页面服务端404问题。

const router = new VueRouter({routes,mode:'history'
})

相关文章:

  • qcow2、raw、vmdk等镜像格式工具
  • Vue框架学习笔记——v-bind数据单向绑定和v-model数据双向绑定
  • Sentinel 热点规则 (ParamFlowRule)
  • fractional Brownian Motion driven stochastic integrals
  • 11.9 实现磁盘相关操作
  • 如何使用GitHub托管代码(简易版)
  • MySQL InnoDB 引擎底层解析(三)
  • ChatGPT暂时停止开通plus,可能迎来封号高峰期
  • Springboot+vue的社区医院管理系统(有报告),Javaee项目,springboot vue前后端分离项目
  • Diffusion Models CLIP
  • P8611 [蓝桥杯 2014 省 AB] 蚂蚁感冒(模拟)
  • 不同content-type对应的前端请求参数处理格式
  • 剪辑视频怎么把说话声音转成文字?
  • 使用 ClickHouse 做日志分析
  • 深度学习之基于CT影像图像分割检测系统
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 230. Kth Smallest Element in a BST
  • C++入门教程(10):for 语句
  • JavaScript 基础知识 - 入门篇(一)
  • js写一个简单的选项卡
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • quasar-framework cnodejs社区
  • React Transition Group -- Transition 组件
  • Service Worker
  • Spark学习笔记之相关记录
  • SpringBoot 实战 (三) | 配置文件详解
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Vultr 教程目录
  • 阿里云购买磁盘后挂载
  • 动态魔术使用DBMS_SQL
  • 诡异!React stopPropagation失灵
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 简单实现一个textarea自适应高度
  • 如何编写一个可升级的智能合约
  • 山寨一个 Promise
  • 使用common-codec进行md5加密
  • 算法---两个栈实现一个队列
  • Android开发者必备:推荐一款助力开发的开源APP
  • UI设计初学者应该如何入门?
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 如何在招聘中考核.NET架构师
  • $.ajax()参数及用法
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Java数据结构)ArrayList
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (强烈推荐)移动端音视频从零到上手(上)
  • (全注解开发)学习Spring-MVC的第三天
  • (一)认识微服务
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。