vue3动态路由刷新出现空白页的原因与最优解

 更新时间:2023年11月16日 16:01:51   作者:二月如若微风  
页面刷新白屏其实是因为vuex引起的,由于刷新页面vuex数据会丢失,这篇文章主要给大家介绍了关于vue3动态路由刷新出现空白页的原因与最优解的相关资料,需要的朋友可以参考下

动态路由刷新出现空白页:

原因:刷新页面的时候动态路由会刷新掉,然后动态路由会重新加载,而匹配路由会在加载路由之前,所以会导致空白页

router.beforeEach(async (to, from, next) => {
    const whiteList = ['/login']
    let token = store.getters.GET_TOKEN;//token
    let hasRoutes=store.state.hasRoutes; //默认是false,刷新页面这个也是false
    let menuList=store.getters.GET_MENULIST; //后端返回的菜单列表
    if (token) {
        if(!hasRoutes){
            bindRoute(menuList);//添加动态路由
            store.commit("SET_ROUTES_STATE",true);
            }
        next();
    } else {
        if (whiteList.includes(to.path)) {
            next();
        } else {
            next('/login');
        }
    }
})
//添加动态路由
const bindRoute = (menuList) => {
    let newRoutes = router.options.routes;
    menuList.forEach(menu => {
        if (menu.children) {
            menu.children.forEach(m => {
                // 菜单转成路由
                let route = menuToRoute(m, menu.name);
                if (route) {
                    newRoutes[0].children.push(route); // 添加到路由管理
                }
            })
        }
    })
    // 重新添加到路由
    newRoutes.forEach(route => {
        router.addRoute(route)
    })
}
// 菜单转成路由
const menuToRoute = (menu, parentName) => {
    let route = {
        name: menu.name,
        path: menu.path,
        meta: {
            parentName: parentName
        },
        children:[],
    }
    if (!menu.component) {
        route.component = ''
    } else {
        route.component = () => import('@/views/' + menu.component + '.vue')
    }
    return route
}

解决办法:递归再调用beforEach,或者直接跳回首页

在你加载路由的地方

递归调用:next({ …to, replace: true });(慎用,如果你的后台管理table是带标签会有问题,没有放对位置会死循环)

跳回首页:next({path:‘/index’})附上解决的代码:

router.beforeEach(async (to, from, next) => {
    const whiteList = ['/login']
    let token = store.getters.GET_TOKEN;
    let hasRoutes=store.state.hasRoutes;
    let menuList=store.getters.GET_MENULIST;
    if (token) {
        console.log(store.state.editabTabs)
        if(!hasRoutes){
            bindRoute(menuList);
            store.commit("SET_ROUTES_STATE",true);
            //next({ ...to, replace: true });//----------解决
            next({path:'/index'}); //----------解决
            }
        next();
    } else {
        if (whiteList.includes(to.path)) {
            next();
        } else {
            next('/login');
        }
    }
})
//添加动态路由
const bindRoute = (menuList) => {
    let newRoutes = router.options.routes;
    menuList.forEach(menu => {
        if (menu.children) {
            menu.children.forEach(m => {
                // 菜单转成路由
                let route = menuToRoute(m, menu.name);
                if (route) {
                    newRoutes[0].children.push(route); // 添加到路由管理
                }
            })
        }
    })
    // 重新添加到路由
    newRoutes.forEach(route => {
        router.addRoute(route)
    })
}
// 菜单转成路由
const menuToRoute = (menu, parentName) => {
    let route = {
        name: menu.name,
        path: menu.path,
        meta: {
            parentName: parentName
        },
        children:[],
    }
    if (!menu.component) {
        route.component = ''
    } else {
        route.component = () => import('@/views/' + menu.component + '.vue')
    }
    return route
}

总结 

到此这篇关于vue3动态路由刷新出现空白页的原因与最优解的文章就介绍到这了,更多相关vue3动态路由刷新空白页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue如何在项目中调用腾讯云的滑动验证码

    vue如何在项目中调用腾讯云的滑动验证码

    这篇文章主要介绍了vue如何在项目中调用腾讯云的滑动验证码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 如何以拖拽方式生成Vue用户界面

    如何以拖拽方式生成Vue用户界面

    这篇文章主要给大家介绍了关于如何以拖拽方式生成Vue用户界面的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • vue-cli4创建项目导入Element-UI踩过的坑及解决

    vue-cli4创建项目导入Element-UI踩过的坑及解决

    这篇文章主要介绍了vue-cli4创建项目导入Element-UI踩过的坑及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • vue  elementUI 表单嵌套验证的实例代码

    vue elementUI 表单嵌套验证的实例代码

    这篇文章主要介绍了vue + elementUI 表单嵌套验证,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Vue设置长时间未操作登录自动到期返回登录页

    Vue设置长时间未操作登录自动到期返回登录页

    这篇文章主要介绍了Vue设置长时间未操作登录以后自动到期返回登录页,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2020-01-01
  • 如何使用vue-json-viewer插件展示JSON格式数据

    如何使用vue-json-viewer插件展示JSON格式数据

    这篇文章主要给大家介绍了关于如何使用vue-json-viewer插件展示JSON格式数据的相关资料,Vue-json-viewer是一个Vue组件,用于在Vue应用中显示JSON数据的可视化工具,需要的朋友可以参考下
    2023-11-11
  • Vue.js最佳实践(五招助你成为vuejs大师)

    Vue.js最佳实践(五招助你成为vuejs大师)

    这篇文章主要介绍了Vue.js最佳实践,本文主要面向对象是有一定vue.js 编辑经验的开发者,需要的朋友可以参考下
    2018-05-05
  • Vue 如何关掉响应式问题

    Vue 如何关掉响应式问题

    这篇文章主要介绍了Vue 如何关掉响应式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 一文详析vue3 Props的用法(父传子)

    一文详析vue3 Props的用法(父传子)

    这篇文章主要给大家介绍了关于vue3 Props的用法(父传子)的相关资料,在Vue3中Props用于组件间数据传递,允许类型检查和默认值设置,文中将用法介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Vue必学知识点之forEach()的使用

    Vue必学知识点之forEach()的使用

    在前端开发中,经常会遇到一些通过遍历循环来获取想要的内容的情形,这时候就需要用到forEach()了,下面这篇文章主要给大家介绍了关于Vue必学知识点之forEach()使用的相关资料,需要的朋友可以参考下
    2021-05-05

最新评论