Vue:项目-动态路由以及坑(完整代码)

news/2024/7/10 0:09:11 标签: vue, 动态路由, 代码,

文章目录

注意的细节 - 很大

//1. 重定向至未注册的路由节点name
会报错,因为进去路由前置beforeEach的to参数,必须含有fullpath,否则进不去,没有定义路由节点的name,这就表明拿不到路径,就会一直报错

//1. 重定向至未注册的路由节点path
可以进去路由前置beforeEach,从而做动态路由的添加、增删操作

//看不懂我说啥,直接看下面的代码的注释即可
const routes = [
    //首页
    {
        path: '/',
        name: 'IndexPage',
        //redirect: {name: 'GenerateShortLinkPage'} ,  //不要这样写,由于GenerateShortLinkPage这个节点的路由不存在,拿不到对应重定向的地址,故会报错
        redirect: '/short-chain' ,  //重定向,不会报错即使你现在这个/short-chain路由节点未定义。但是到时也可以进去路由前置beforeEach,从而做动态路由的增添
        meta: {
        }
    },
]

const myRouter = VueRouter.createRouter({
    // 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。
    history: VueRouter.createWebHashHistory(),
    routes, // `routes: routes` 的缩写
})

完整代码

路由节点的获取到时可以直接换成请求后台接口数据即可,我现在代码动态路由节点是写死的

官网: https://router.vuejs.org/zh/guide/advanced/dynamic-routing.html#%E5%9C%A8%E5%AF%BC%E8%88%AA%E5%AE%88%E5%8D%AB%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%B7%AF%E7%94%B1


//待添加的路由数据
var menuDatas = [
            {
                id: 1,
                level: 1,
                name: '工具库',
                sort: 1,
                menuIcon: 'location',
                childrens: [
                    {
                        parentId: 1,
                        level: 2,
                        id: 4,
                        name: '图床',
                        sort: 1,
                        routerPath: '/figure-bed',
                        routerName: 'FigureBedPage',
                        routerComponent: 'FigureBedPage'
                    },
                    {
                        parentId: 1,
                        level: 2,
                        id: 5,
                        name: '短链生成器',
                        sort: 1,
                        routerPath: '/short-chain',
                        routerName: 'GenerateShortLinkPage',
                        routerComponent: 'GenerateShortLinkPage'
                    },
                    {
                        parentId: 1,
                        level: 2,
                        id: 6,
                        name: '代码生成器',
                        sort: 1,
                        routerPath: '/generate-code',
                        routerName: 'GenerateCodePage',
                        routerComponent: 'GenerateCodePage'
                    },
                ]
            },
            {
                id: 2,
                level: 1,
                name: '社交',
                sort: 2,
                menuIcon: 'icon-menu',
                childrens: []
            }
            ,
            {
                id: 3,
                level: 1,
                name: '系统设置',
                sort: 3,
                menuIcon: 'setting',
                childrens: [
                    {
                        parentId: 3,
                        level: 2,
                        id: 8,
                        name: '系统更新历程',
                        sort: 1,
                        routerPath: '/update-timeline',
                        routerName: 'UpdateTimelinePage',
                        routerComponent: 'UpdateTimelinePage'
                    },
                ]
            }
        ]



//注册路由
function registerRoute(menuDataList, router) {

    if(!router || (menuDataList && menuDataList.length <= 0)) {return;}

    menuDataList.forEach((menuDataElem) => {


        var registerRouteInfo = {
            path: menuDataElem.routerPath,
            name: menuDataElem.routerName,
            component: window[menuDataElem.routerComponent]
        }


        if (menuDataElem.routerName && !router.hasRoute(menuDataElem.routerName)) {
            let parentRouteName = menuDataElem.parentRouteName;
            if(strIsEmpty(parentRouteName)) {
                console.log("路由正在注册(普通路由):", menuDataElem,registerRouteInfo)
                router.addRoute(registerRouteInfo)
            }else {
                console.log("路由正在注册(子路由):", menuDataElem,registerRouteInfo)
                router.addRoute(parentRouteName,registerRouteInfo)
            }
        }else if (menuDataElem.routerName) {
            console.log("路由已存在:", menuDataElem,registerRouteInfo)
        }

        //子路由注册
        if (menuDataElem.childrens && menuDataElem.childrens.length > 0) {
            registerRoute(menuDataElem.childrens,router)
        }
    })
}


//是否存有路由
function existRoutePath(path, routes) {
    let findIndex = routes.findIndex((route => {
        return route.path == path;
    }))
    return findIndex > 0 ? true :false;
}



//路由注册
myRouter.beforeEach((to, from) => {
    if(!existRoutePath(to.fullPath, myRouter.getRoutes())) {
        registerRoute(menuDatas, myRouter)
        console.log("所有路由信息:", myRouter.getRoutes())
        //前面注册完,再次检测是否存有,没有,说明没权限访问的路由页面
        if(existRoutePath(to.fullPath,myRouter.getRoutes())) {
            return to.fullPath
        }else {
            return 'not-permissions-page'
        }
    }
})

http://www.niftyadmin.cn/n/1657592.html

相关文章

一步一步学Silverlight 2系列文章

概述 由TerryLee编写的《Silverlight 2完美征程》一书&#xff0c;已经上市&#xff0c;在该系列文章的基础上补充了大量的内容&#xff0c;敬请关注。官方网站&#xff1a;http://www.dotneteye.cn/silverlight Silverlight 2 Beta 1版本发布了&#xff0c;无论从Runtime还是T…

问题解决:Java - Stream流toMap的坑

背景&#xff1a; Stream流toMap的时候映射的value一定要不为空&#xff0c;否则报错   解决方案&#xff1a; 先针对流进行过滤&#xff0c;然后才进行toMap即可 Testpublic void test21() {Landlord landlord new Landlord();landlord.setName("lrc");landlord.s…

Java常用脚本:Nexus批量上传本地仓库增强版脚本(强烈推荐)

若想使用Linux-Shell版本&#xff1a;请移步到这里 文章目录概述核心代码使用帮助文档使用时必须指定本地仓库参数校验取消上传成功上传概述 代码仓库以及打包好后的jar文件&#xff1a; 请移步到这&#xff0c;顺便随手点点星星哦&#xff01; 增加内容&#xff1a; 消息提示更…

qdox - 二次封装(基于Java源码解析Java的结构)

文章目录概述代码二次封装工具测试概述 官网&#xff1a; https://github.com/paul-hammant/qdox   依赖&#xff1a; https://mvnrepository.com/artifact/com.github.shalousun/qdox 代码 <!--源码解析 smartdoc就是用这个进行解析的 --><!-- https://mvnreposito…

Mock.java - 二次封装(基于属性结构类型生成测试数据)

文章目录概述代码二次封装工具测试概述 官网&#xff1a; https://gitee.com/ForteScarlet/Mock.java   依赖&#xff1a; https://mvnrepository.com/artifact/io.gitee.ForteScarlet/mock.java 代码 二次封装 工具 EnhanceClassUtil.java package work.linruchang.lrcuti…

应该怎样去爱

了解到艾琳娜众叛亲离的痛苦&#xff0c;汤姆逊开始给她匿名寄包裹&#xff0c;以鼓励她。      艾琳娜大学毕业后&#xff0c;在一家药品公司找到了一份会计工作。可让艾琳娜担心的是科比的母亲是个身患癌症的老太太。艾琳娜不愿意看到恋人失去母亲&#xff0c;几天后&a…

“阿一web标准学堂”第1课:web标准概述(附视频、课件、代码下载)

阿一web标准学堂前言 大家好&#xff0c;我是阿一&#xff0c;杨正祎。今天《阿一web标准学堂》就要开讲了&#xff0c;欢迎大家来学习讨论哦。 《阿一web标准学堂》是一套面向web标准初学者的视频系列。虽然我也只是一个web标准刚入门的学习者&#xff0c;但是我还是希望能通过…

发布网站里预编译错误

项目的严重问题&#xff1a;发布不成功 VS2005 ASP.NET 2.0 C# 以前发布网站顺利&#xff0c;最近出现一下错误对象“/1fbd4eb5_ea55_45c9_84e1_a5fe79064e27/wehbv4rzyexscf2fumbe7p1a_18.rem”已断开连接或不在该服务器上。 网上关于这方面的问题很少&#xff0c;去MSDN 和…