vue 动态添加的路由页面刷新时失效的原因及解决方案
2021-03-05 04:06
1181 查看
问题描述
昨天在做vue后台管理系统有关权限页面动态添加到路由的功能时,遇到一个问题:动态添加的路由页面,在页面刷新时出现了404的情况。
场景
后台管理系统的权限控制是通过在前端页面定义权限code, 把code给后台同学保存配置到表中,之后根据后台返回的权限code列表与前端页面配置的code菜单列表做筛选匹配,code相等的页面就是有权限的页面,再通过router.addRoute()动态添加到路由中,有权限的路由才可以被访问,否则会提示无权限。
固定路由一开始就会放在new Router中,比如登录页面login
接口返回
前端菜单定义
vuex中的方法
出现的问题
登录后,通过调用vuex中的方法,完成获取权限code,动态筛选权限路由页面操作,然后通过router.addRoute()将有权限菜单添加到路由中,进入动态添加的路由页面,刷新页面出现404
原因分析
页面刷新时,路由重新初始化,动态添加的路由此时已不存在,只有一些固定路由(比如登录页面)还在,所以出现了404的情况
解决方案
VUEX store中存储的数据会在页面刷新时清空。
在路由的全局导航router.beforeEach处做个判断,根据VUEX中存放的list是否有值来判断页面是否是刷新,如果不为0,则是第一次登陆,登录后会走匹配路由的方法,不会有问题;如果list.length为0,就为刷新页面,需要重新执行路由匹配,重新添加动态路由即可。
实现代码 route/index.js的导航守卫中添加逻辑判断
―――router.js――――-
const constantRoutes = [ { path: '/', redirect: '/login' }, { path: '/login', name: 'login', meta: { auth: false }, component: () => import('@/views/login') }, { path: '/layout', name: 'layout', meta: { auth: true }, component: () => import('@/views/layout/index'), children: [ { path: '/index', name: 'index', component: () => import('@/views/home') } ] }, { path: '*', component: () => import('@/views/error/404') } ] Vue.use(VueRouter) const createRouter = () => new VueRouter({ routes: constantRoutes }) export function resetRouter() { const newRouter = createRouter() router.matcher = newRouter.matcher // reset router } const router = createRouter() //页面刷新后重新设置权限页面动态路由,防止出现动态路由404问题 const reSetPermissionList = to => { return new Promise((resolve, reject) => { if (to.path !== '/login' && store.state.permission.permissionList.length === 0) { store .dispatch('permission/getPermissionList') .then(() => { resolve('permCode') }) .catch(error => { resolve('permCode') }) } else { resolve() } }) } router.beforeEach((to, from, next) => { const accessToken = localStorage.getItem('accessToken') if (_.isEmpty(accessToken)) {//是否已经登录 否 去登陆页面 next({ path: '/login', query: { redirect: to.fullPath } }) } else { //已登录用户进入页面 if (to.path === '/login') { next({ path: '/index' }) } else { reSetPermissionList(to).then(data => { data === 'permCode' ? next({ path: to.path, query: to.query }) : next() }) } } })
总结
主要通过在全局导航处判断VUEX中的数据是否存在,判断页面是否刷新,是的话重新走一遍权限路由匹配的方法。
以上就是vue动态添加的路由页面刷新时失效的原因及解决方案的详细内容,更多关于vue 路由页面刷新的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章:相关文章推荐
- vue 解决addRoutes动态添加路由后刷新失效问题
- 【VUE】通过后端重定向到VUE的页面后,前端路由失效的解决方案!
- JS动态修改页面EasyUI datebox不生效、EasyUI动态添加Class、EasyUI动态渲染解析解决方案
- Vue动态添加路由实现菜单和数据权限管理
- 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新
- vue为页面动态添加title
- vue 刷新之后 嵌套路由不变 重新渲染页面的方法
- vue中路由前进到某个页面,后退再前进,页面不刷新问题
- JS动态修改页面EasyUI datebox不生效、EasyUI动态添加Class、EasyUI动态渲染解析解决方案
- vue路由history模式刷新页面出现404问题
- vue实现权限控制路由(vue-router 动态添加路由)
- 关于vue-print-nb插件,刷新页面后,@media print样式丢失解决方案
- js动态加载html,加载后的页面元素某些事件失效的解决方案
- VUE-Router 同一页面第二次进入不刷新 问题以及几个解决方案。
- 利用localStorage防止页面动态添加数据刷新后数据丢失
- vue 路由传递参数,刷新页面后参数丢失
- vue通过地址传参跳转同一路由页面,页面不刷新的解决办法
- vue刷新当前路由:router-view 复用组件时不刷新的3种解决方案总结
- Vue实现远程获取路由与页面刷新导致404错误的解决
- ImageButton点击之后不动态刷新页面的解决方案