首页 > 其他分享 >动态路由-刷新页面时的 短暂404 bug修复

动态路由-刷新页面时的 短暂404 bug修复

时间:2023-07-02 23:00:31浏览次数:53  
标签:用户 token 404 router bug 路由 页面

动态路由-刷新页面时的bug修复
1.问题说明

如果我们手动刷新浏览器网页,会发现跳到了404页面
对于addRoute添加的路由,在刷新时会白屏

 


2.问题分析
解决页面刷新时,页面 404 问题

在静态路由后面有一个路由通配符,addRoutes添加的路由是异步添加的。
路由设置中的404页处在中间位置,而不是所有路由的末尾了,path:'*' 导致可以匹配任意页面
解决动态路由,刷新页面白屏问题

已知 Vue- router 的Bug
凡是 addRoutes 动态添加的路由,必须在重新调用一下 next() 并且需要手动指定路径才可以。
3.解决
(1) 解决页面刷新时,页面 404 问题

把404页改到路由配置的最末尾就可以了

 

filterRoutes.push(
    { path: '*', redirect: '/404', hidden: true }
  )
next({
    path: to.path, // 保证路由添加完了再进入页面 (可以理解为重进一次)
    replace: true // 重进一次, 不保留重复历史
  })

完整代码

router.beforeEach(async(to, from, next) => {
  // 设置当前页面标题
  document.title = getPageTitle(to.meta.title)

  // 获取 token
  const token = store.state.user.token

  // 显示进度条效果
  NProgress.start()

  // 判断 token 是否存在
  if (token) {
    // 是否是登录页面 、
    if (to.path === '/login') {
      // 如果有 token,访问登录页面,跳转到主页
      next('/')
    } else {
      // 如果有 token,访问不是登录页面,直接放行

      // 1.判断是否存在用户信息(已经将用户信息存到 Vuex 中)
      if (!store.getters.userId) {
        // 2.如果没有用户信息,需要获取用户信息 --> 用户权限信息

        // ** 获取用户信息的时机:**
        // 1.因为依赖 token 去获取用户数据,所以必须要在获取了token 之后才能调用这个 action 函数
        // 2.因为跳转到首页之后就要显示数据了,所以要求我们在跳转进入首页之前就提前拿回用户个人数据
        const menus = await store.dispatch('user/getUserInfo')

        // 3.根据后台返回的权限信息,从本地预置的 8 个路由里面筛选出当前用户有权访问的路由
        const filterRoutes = asyncRoutes.filter(route => {
          // 获取到每一个路由规则的名称
          const routeName = route.children[0].name
          // 判断获取到的路由名称在不在 menus 权限信息中
          return menus.includes(routeName)
        })

        // 解决页面刷新 404 的问题
        // 就是将通配符放置到筛选好的路由最后面
        filterRoutes.push({ path: '*', redirect: '/404', hidden: true })

        // 通过 addRoutes 动态添加的路由,是存到内存中的,并不会对 routes 产生影响
        router.addRoutes(filterRoutes)

        // 5.左侧菜单是从 Vue-router 中的 routes 获取的数据进行渲染,将左侧菜单数据获取方式进行调整(Vuex)
        // 将动态路由传递给 mutation 方法,进行合并
        store.commit('permission/setRoutes', filterRoutes)

        // 通过 addRoutes 添加的路由,访问以后可能存在白屏的问题
        // 原因是 Vue-router 的已知 Bug
        // 之前是没有这些动态路由的,然后我们使用 addRoutes 添加以后才有的路由规则
        // 如果这时候想访问动态添加的路由,必须手动告诉 Vue-router 我要去哪里
        next({ path: to.path, replace: true }) // 会调用 router.replace 方法,清空之前的浏览历史,等于是重新进入路由
      }

      // ** 动态路由的处理时机:**
      // 1.先获取到用户信息
      // 2.跳转之前
      // ** 思路:**
      // 1.判断是否存在用户信息(已经将用户信息存到 Vuex 中)
      // 2.如果没有用户信息,需要获取用户信息 --> 用户权限信息
      // 3.根据后台返回的权限信息,从本地预置的 8 个路由里面筛选出当前用户有权访问的路由
      // 4.使用 Vue-router 提供的 addRoutes 方法,将筛选出来的路由添加到路由对象中
      // 5.左侧菜单是从 Vue-router 中的 routes 获取的数据进行渲染,将左侧菜单数据获取方式进行调整(Vuex)

      next()
    }
  } else {
    // 判断访问的路由在不在白名单
    if (whiteList.includes(to.path)) {
      // 如果没有 token,但在白名单中,则放行
      next()
    } else {
      // 如果没有 token,也不在白名单中,则跳转到登录页
      next('/login')
    }
  }

 
})
//手动强制关闭一次  为了解决 手动切换地址时  进度条的不关闭的问题

router.afterEach(() => { NProgress.done(); });

 


 

标签:用户,token,404,router,bug,路由,页面
From: https://www.cnblogs.com/JohnnyLei/p/17521623.html

相关文章

  • 从旧路由器中获取PPPoE账号密码
    参考了:利用PPPOE认证获取路由器中宽带账号密码_pppoe账号密码验证过程_rebootORZ的博客-CSDN博客 其中RouterOS镜像地址为MikroTikRoutersandWireless-Softwaremikrotik-6.41.3.iso 创建虚拟机为自定义创建需要同上述参考博文中一样选择桥接! 创建好后,打开编......
  • maxscript pathConfig.appendPath 的 bug
    pathConfig.appendPath可以很方便的把2个路径Combine在一起不管你后面带不带斜杠pathConfig.appendPath@"C:\try"@"kle.jpg""C:\try\kle.jpg"pathConfig.appendPath@"C:\try"@"kle.jpg""C:\try\kle.jpg"很酷,然后path......
  • Vue router-view key 导致路由切换非router-view部分也进行刷新
    <router-view> 组件是一个functional组件,渲染路径匹配到的视图组件。<router-view> 渲染的组件还可以内嵌自己的 <router-view>,根据嵌套路径,渲染嵌套组件。 如果中最外层的<router-view>中增加了:key="$route.fullPath",会导致子路由中的router-view之外的部分也会被重新......
  • 路由引入正解(一)
    目录理论实验一实验二理论前言路由引入是我们在路由学习阶段的一个里程碑,也是传统HCIE考试阶段最难的地方,是很多同学的弱点,确实路由引入比较难以理解,也鲜有人老师能把这一部分讲好。路由引入命令极其简单,原理却没有那么容易理解。路由引入的本质:路由引入的本质是进程之间的路......
  • OpenWrt+R2S 主路由、旁路由配置详解
    1、R2S用作主路由R2S作为主路由的好处,所有流量都经过软路由,客户端不需要额外配置坏处:所有流量都经过软路由1.1网络拓扑1.2R2S的WAN口配置家庭一般都是光猫拨号,光猫的网口直接连上R2S的WAN口,R2S一般保持默认配置就好,即配置DHCP客户端自动获取IP地址就好了。比如你是校园......
  • 路由器端口映射设置教程
    路由器端口映射这个功能,对于大多数的普通用户来说,实际上是用不上的,不过呢,偶尔也有朋友会咨询这个问题,所以还是写了一篇教程,可做参考首先我们打开路由器可以看到然后我们根据图二点击“转发规则”然后点击虚拟服务器可以看到这里大家就可以看到我们需要映射的地方了我把图片放大......
  • vue中router-link路由携带参数跳转
    在对应的路由模块儿中path:'courseList/:id?'router-link中书写方法如下<templateslot-scope="scope"><router-link:to="{path:'/course/courseList/'+scope.row.id}">跳转按钮</router-link></el-ta......
  • thinkphp6多用用模式下缩短路由
    场景描述:要做seo,要缩短路由。原xxx.com/home/article/1改为xxx.com/article/1解决办法:index.php<?php//+----------------------------------------------------------------------//|ThinkPHP[WECANDOITJUSTTHINK]//+---------------------------------------......
  • Debug-logcat使用
    注释掉一行关键代码运行应用,应用崩溃了解决方案:在LogCat中寻找最后一个异常及其栈跟踪的第一行(对应着源代码)这里是问题发生的地方,也是寻找解决方案的最佳起点......
  • Debug Golang源码中的单元测试
    goland配置如上,既可以debuggolang源码中的单元测试。......