文章目录

  • 动态添加路由
  • 案例
    • 初步
    • 动态添加路由-使用导航守卫
    • 解决刷新404问题
    • 完整代码:

动态添加路由

大概简而言之,就是需要路由是可以按照项目需求进行配置添加的,而不是一开始就配置好的。
就好比,一般的静态配置的路由时直接在routes里面进行配置,
但是动态路由是通过 router.addRoute() 进行配置,

  • 注意:vue3删除了addRoutes(),只能addRoute()一条一条进行加入,写addRoutes()是无效的。

案例

此处的登录网页,有三个身份【学生】【老师】【管理员】

这三个身份权限不同,登录进去后显示的导航/页面也会不同。这个时候就需要判断权限,然后按需求动态的添加路由。

初步

在导航对应的组件里,先存上三个身份对应的导航信息(一般这个数据是可以从后端拿的,但是我们后端没写这个哈哈哈哈)

//页面所需要展示的导航
const navList=reactive([ //默认的数据是学生导航{id:1,imgUrl:"./static/imgs/nav1.png",imgUrlAfter:"./static/imgs/nav1after.png",text:'个人信息',isActive:true,pushUrl:'studentinfo'},{id:2,imgUrl:"./static/imgs/nav2.png",imgUrlAfter:"./static/imgs/nav2after.png",text:'课程管理',isActive:false,pushUrl:'schedulingtable'},{id:3,imgUrl:"./static/imgs/nav3.png",imgUrlAfter:"./static/imgs/nav3after.png",text:'作业管理',isActive:false,pushUrl:'task'},{id:4,imgUrl:"./static/imgs/nav4.png",imgUrlAfter:"./static/imgs/nav4after.png",text:'考勤记录',isActive:false,pushUrl:'attendance'},{id:5,imgUrl:"./static/imgs/nav5.png",imgUrlAfter:"./static/imgs/nav5after.png",text:'请假管理',isActive:false,pushUrl:'studentLeave'},{id:6,imgUrl:"./static/imgs/nav6.png",imgUrlAfter:"./static/imgs/nav6after.png",text:'成绩管理',isActive:false,pushUrl:'score'},{id:7,imgUrl:"./static/imgs/nav7.png",imgUrlAfter:"./static/imgs/nav7after.png",text:'修改密码',isActive:false,pushUrl:'adminModifyPasswordPopup'}])//老师导航const text2 = reactive(['个人信息','课程表','作业管理','考勤记录','请假管理','综合评分','修改密码'])//管理员导航const text3 = reactive(['个人信息','课程管理','项目组','考勤管理','请假管理','综合评分','修改密码'])
  • 然后在登录的时候,会保存用户登录的信息。
  • 还是在这个组件中,获取登录时保存的信息,判断此用户的身份,然后再根据身份权限进行展示导航的信息。

由于学生导航是默认的所以不需要判断

 onMounted(()=>{// 判断身份,显示不同的nav描述// console.log(store.state);if (store.state.user.userid==2) {userName.value = '老师'let x = 0navList.forEach(item => {item.text = text2[x]item.pushUrl=pushUrl2[x]x++});}if (store.state.user.userid==3) {userName.value = '管理员'let x = 0navList.forEach(item => {item.text = text3[x]item.pushUrl=pushUrl3[x]x++});}//   判断当前路由,定位到导航,防止刷新后消失navList.forEach(item => {item.isActive = falseif (item.pushUrl===route.fullPath.split('/')[1]) {item.isActive = true}});if (route.fullPath=='/home') {navList[0].isActive = true}})

动态添加路由-使用导航守卫

在导航守卫中添加,点击登录就会跳转到 /home 路由。

  • 然后在导航守卫进行拦截,判断用户身份,是学生就router.addRoute( ’ 学生路由’ ) 老师管理员皆是同理,只不过得注意,需要遍历 学生路由 进行addRoute ()

解决刷新404问题

  • 但是如果只addRouter(),那么你在登录进去后,一旦刷新页面,也许页面就会丢失,404。
  • 因为刷新后,路由重新初始化,动态添加的路由此时已不存在,只有一些固定的公共路由(比如登录页面)还在,所以出现了404的情况。
    这是肯定不能的,总不能不让用户刷新吧。
  • 解决办法: 将动态添加的路由存在vuex中,因为页面刷新vuex也会清空。所以就可以理解为,vuex中没有动态路由,就代表页面刷新了,需要重新添加路由。如果vuex中存在,就正常跳转。
    重要部分代码解释:

完整代码:

import routes from './routers' //公共路由
import routersAdmin from './routersAdmin'
import routersStudent from './routersStudent'
import routersTeacher from './routersTeacher'
const router = createRouter({history: createWebHistory(),routes: routes, //引进的routes.js
})
router.beforeEach((to, from, next) => {// nprogress.start() //进度条// 在登录页 清除信息if (to.path == '/login') {localStorage.clear('USERID')localStorage.clear('USERINFO')localStorage.clear('TOKEN')store.dispatch('getUserId')store.dispatch('getLogin')next()}// 判断是否登录if (store.state.user.userid == null) {// 不是登录的路由 不跳转if (to.path != '/login') {next({ path: '/login' })} else {next()}} else {// addRoute的加入路由,刷新就会消失,所以此时需要重新加入路由// 判断vuex的addRouters是否为空,若为空 动态路由未加入(刷新后/初始化) 一定要有一个条件,不然会陷入死循环if (store.state.user.addRouters.length == 0) {// 判断权限if (store.state.user.userid == 1) {// 派发action存动态路由store.dispatch('generateRoutes', routersStudent)routersStudent.forEach(route => {router.addRoute(route)});// 首次跳入的页面 nav1if (to.path == '/home') {next('/home/info')} else {// 加入动态路由后,继续进行跳转next({...to, replace: true })}} elseif (store.state.user.userid == 2) {store.dispatch('generateRoutes', routersTeacher)routersTeacher.forEach(route => {router.addRoute(route)});if (to.path == '/home') {next('/home/info')} else {// 加入动态路由后,进行跳转next({...to, replace: true })}} elseif (store.state.user.userid == 3) {store.dispatch('generateRoutes', routersAdmin)routersAdmin.forEach(route => {router.addRoute(route)});if (to.path == '/home') {next('/home/info')} else {// 加入动态路由后,进行跳转next({...to, replace: true })}}} else {// 若addRouters是不为空,则是正常路由跳转(没有进行刷新操作)// nprogress.done();next()}}})

动态添加路由 addRoute添加路由刷新404相关推荐

  1. vue动态路由添加,vue-router的addRoute方法实现权限控制,添加根路由和子路由

    addRoute 路由分为静态路由和动态路由 静态路由和动态路由的优缺点 动态路由实现思路: 动态路由遇到的问题与解决方式 动态添加子路由 路由分为静态路由和动态路由 静态路由和动态路由的优缺点 1. ...

  2. vue动态路由添加后刷新显示空白页或404

    刷新显示空白页面 原因:页面刷新会导致vuex数据丢失,所以无法动态添加路由 1.在store user.js state中添加字段isAddRoutes:false,用来判断是否已经添加完动态路由的 ...

  3. Vue 动态路由,使用 addRoute 添加(分享)

    文章目录 1. 静态路由 1.1 概述 1.2 代码实现 2. 动态路由 2.1 概述 2.2 代码实现 1. 静态路由 1.1 概述 已经确定了路由的数量(一般是侧边栏的路由),最开始可以把路由表配 ...

  4. vue路由添加.html,怎么使用VueRouter的addRoutes方法实现动态添加用户的权限路由

    怎么使用VueRouter的addRoutes方法实现动态添加用户的权限路由 发布时间:2021-04-26 13:34:44 来源:亿速云 阅读:76 作者:小新 小编给大家分享一下怎么使用VueR ...

  5. Nginx部署Vue项目动态路由刷新404

    目录 前言 第一次 第二次 前言 记录下Nginx部署Vue项目刷新404的解决方案,遇到了两次,route用的是history路由模式,动态路由: {path: '/article/:blogId' ...

  6. bond添加路由_配置路由通信

    两台主机两个路由设备通信 现有主机A和主机B,且中间有两个路由设备连接,主机A的IP地址为192.168.1.100/24,主机B的IP地址为10.0.0.100/8,路由R1与主机A相连,且有两个接 ...

  7. Vue动态路由路径重复以及刷新丢失页面问题

    1.使用router.addRoutes(teacherRouter);添加完路由切换路由时,vue会警告路由名字重复 问题出现原因是:动态路由添加时调佣addRoutes();它只会帮你注入路由,不 ...

  8. Vue.js-Day05【安装路由(vue-router)、如何使用vue-router、404配置、激活class、动态路由、编程式导航、路由嵌套、路由元信息、导航拦截】

    Vue.js实训[基础理论(5天)+项目实战(5天)]博客汇总表[详细笔记] 目   录 1.单页面应用 1.1.多页面应用 1.2.单页面应用 1.3.vue-router 2.安装vue-rout ...

  9. vue 创建项目并添加路由(Vue路由入门教学,图文详解)

    注:初学vue,如有错误.请指教,谢谢! 1.vue-cli 1.1 介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 1.2 下载vue-cli 在命令行下运行 npm ins ...

最新文章

  1. GOF23设计模式(结构型模式)代理模式~
  2. 从看见到听见,机器人传感能否解决智能制造检测的最后一公里难题?
  3. php获取文件目录文件名,php获取路径中的文件名的方法有哪些
  4. Portal-Basic Java Web应用开发框架V3.0正式发布(源码、实例及文档)
  5. 在C#中使用自定义消息
  6. Linux 命令 速记
  7. C++复习(五)(const、static、inline、引用与指针、new/delete)
  8. 使用IDEA 自带的 MySQL UI 工具插件
  9. modscan36--my milestone
  10. 气缸模组控制一以1200PLC为例从易到难学习
  11. 卫星影像的RPC参数
  12. c# 判断时间是否在 某一时间段内
  13. TensorFlow 2019
  14. Windows上使用ssh密钥连接Linux(以centos7为例)和Windows与Windows的免密钥连接
  15. 网吧服务器掉硬盘,网吧服务器磁盘压力大的解决过程
  16. Unity 颜色查找表富文本颜色
  17. 不可逆加密:说一下你常用的加密算法
  18. uTools基于Everything的本地搜索拓展语法
  19. qcom android GPS 启动流程
  20. 驱动程序备份专家 --- http://61.158.10.15/soft/system/WinDrvExpert.zip

热门文章

  1. AlexNet网络模型
  2. 做了 3 年企业级 SaaS,我收获的 10 点心得(转)
  3. requests 警告:InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verif
  4. 图像增强--grammma contrast transformation
  5. 停电。。。烦烦烦!!!
  6. php代码实现无限极分类,PHP实现无限极分类_php
  7. 《乱舞天下》昨天终于开始封闭测试了
  8. 东方财富网-股吧论坛帖子信息采集
  9. Rman还原种子数据库练习
  10. c++构造析构函数专题