广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3+Vite实现动态路由的详细实例代码
  • 798
分享到

Vue3+Vite实现动态路由的详细实例代码

2024-04-02 19:04:59 798人浏览 泡泡鱼
摘要

项目基本目录 1.首先定义初始默认的路由routes(router.js文件),vue文件使用import引入可以按需加载 import { createRouter,

项目基本目录

1.首先定义初始默认的路由routes(router.js文件),vue文件使用import引入可以按需加载

import {
    createRouter,
    createWEBHashHistory
} from "Vue-router";
 
import store from '../store/index.js'
 
const routes = [{
        path: "/login",
        component: () => import("../view/Login/index.vue"),
 
        children: [],
        meta: {
            title: '登录页',
            hideMenu: true, //加入hideMenu属性,不展示在侧边栏
        },
        name: "Login",
    },
    {
        path: "/",
        component: () => import("../view/Home/index.vue"),
        meta: {
            keepalive: true,
            title: "主页",
        },
        name: 'Home',
        // hideMenu: true,//不展示在侧边栏
        children: [],
        redirect: '/index'
    },
]

2.在store的login.js模块写入调用后端数据的函数(写在vuex的action对象中,方便全局异步调用)

Vuex 允许我们将 store 分割成模块(module),比如登录模块,项目各个业务不相关的模块。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块(具体可以看主页另一篇博客)

3.执行addRoutes函数获取动态路由 (在router.js文件,点击登录成功后,在全局路由守卫去判断是否登录成功,再调用addRoutes函数) 

(1)全局路由守卫逻辑具体可看注释,好处是进入项目之后,刷新页面路由守卫会拦截跳转,可以重新执行addRoutes()获取路由,先获取动态路由,再执行跳转,不然页面会报本地路由找不到(一个小坑)

(代码如下)

router.beforeEach(async (to, from, next) => { //路由守卫
    if (store.state.login.token) { //存在token
        if (to.path == '/login') { //存在token,如果想跳转到登录页,默认有token跳转进项目首页
            next({
                path: '/'
            })
        } else { 
                //如果存在token,跳转进项目页面,则判断当前后端返回的路由有无长度
                //或者有无即将跳转路由的name
            if (store.getters['login/getRoutes'].length || to.name != null) {
                next() //有的话直接跳转
            } else { //不满足条件的话,重新请求后端动态路由数据
                await addRoutes(); //addRoutes()必须加入await!!!!等待逻辑执行完毕获取路由
                // 如果 addRoute 未完成,路由守卫会一层一层的执行执行,不加next()可能导致卡死!
                //直到 addRoute 完成,找到对应的路由
                next({
                    ...to,
                    replace: true
                })
            }
        }
    } else {
        if (to.path == '/login') {
            next()
        } else {
            next('/login')
        }
    }
})

后端返回的格式

(2)(重点在这,前面的步骤都可以不是重点)Vite使用import.meta.glob动态导入view文件夹所有前端页面,并调用addRoutes()函数执行获取动态路由数据并做处理(代码如下),主要作用是替换掉后端返回的component格式,再addRoute进路由表(看不懂的可以看代码注释或者可以搬进自己的项目打印看看每一步获取的数据)

let asyncRoutes = [] //定义数组接收后端返回的路由
 
const routeAllPathToCompMap =import.meta.glob(`../view*.vue`);
/
async function addRoutes() {
    await store.dispatch('login/getNewRoutes').then((res) => { //获取后端返回的动态路由
        if (res.data && res.data.length) {
            // let homeRouteChildren = [];
            asyncRoutes = res.data;
            
            //服务端配置了路由,但前端还没添加对应文件的路由列表,内容是路由的component值(服务端的)
            // const unForList = ['']
            const homeChildren = routes[1].children;
            const dfs = (parentRouteName = 'Home', asyncRoutes = [], originRouteChildren = []) => {
                if (!Array.isArray(asyncRoutes)) return [];
                asyncRoutes.forEach(route => {
                    // if (unForList.includes(route.component)) return;

                    route.component = routeAllPathToCompMap[`../${route.component}`];
                    // route.component = () => import(`../${route.component}`);
                    const routeChildren = route.children;
 
                    router.addRoute(parentRouteName, route);
 
                    route.children = dfs(route.name, routeChildren)
 
                    originRouteChildren.push(route)
                })
                return originRouteChildren
            }
            // homeRouteChildren = dfs(asyncRoutes)
            dfs('Home', asyncRoutes, homeChildren)
        }
    });
}

最终转化完成,路由数据格式如下 

动态路由到此完成

总结

到此这篇关于vue3+Vite实现动态路由的文章就介绍到这了,更多相关Vue3+Vite动态路由内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue3+Vite实现动态路由的详细实例代码

本文链接: https://www.lsjlt.com/news/166029.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3+Vite实现动态路由的详细实例代码
    项目基本目录 1.首先定义初始默认的路由routes(router.js文件),vue文件使用import引入可以按需加载 import { createRouter, ...
    99+
    2022-11-13
  • vue实现动态路由详细
    目录一、前端控制1、在router.js文件(把静态路由和动态路由分别写在router.js) 2、store/permission.js(在vuex维护一个state,通过配角色来...
    99+
    2022-11-12
  • VUE3+vite项目中动态引入组件与异步组件的详细实例
    目录一、全量注册,随用随取1. 把项目中所有vue文件注册成异步组件。2. 获取组件3. 参考如下二、使用@rollup/plugin-dynamic-import-vars插件 1...
    99+
    2022-11-13
  • Vue 动态路由的实现详情
    前言: 动态路由是一个常用的功能,根据后台返回的路由json表,前端动态显示可跳转的路由项,下面来讲解一下具体的实现方式: 大致业务需求:前端在login登陆页,输入账号密码后,点击...
    99+
    2022-11-13
  • ReactRouter中实现嵌套路由和动态路由的示例
    目录Router 组件的实现Routes 组件的实现Link 组件的实现Switch组件的实现createBrowserHistory 函数实现React Router 是...
    99+
    2023-05-19
    React Router 嵌套路由和动态路由 React Router 嵌套路由 React Router动态路由
  • vue-admin-template 动态路由的实现示例
    提供登录与获取用户信息数据接口 在api/user.js中 import request from '@/utils/request' const Api = { Take...
    99+
    2022-11-12
  • Vue实现动态路由导航的示例
    目录1、导航守卫二、功能展示 三、原理四、功能实现⛵小结1、导航守卫 “导航” 表示路由正在发生改变 正如其名,vue-router 提供的导航守卫...
    99+
    2023-02-24
    Vue 动态路由导航 Vue 路由导航
  • element动态路由面包屑的实现示例
    要掌握:localStorage,组件封装​ emm,第一次上传视频转gif的图片,效果不咋好。。。 视频转gif 的软件连接 https://www.jb51.net...
    99+
    2022-11-12
  • Java实现动态代理的实例代码
    目录前言静态代理 动态代理 CGLib实现动态代理 总结前言 动态代理在Java中有着广泛的应用,比如Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC...
    99+
    2022-11-12
  • Python OpenCV实现姿态识别的详细代码
    目录前言环境安装下载并安装Anaconda安装JupyterNotebook生成JupyterNotebook项目目录下载训练库单张图片识别导入库加载训练模型初始化载入图片显示图片调...
    99+
    2022-11-13
  • Element实现动态表格的示例代码
    目录【代码背景】【代码实现】#1# -> 代码复用的基础是你需要一个可复用的组件#2# -> 在展示页面使用动态表格组件#3# -> 如何给动态表格根据需求动态添加...
    99+
    2022-11-12
  • Vue路由监听实现同页面动态加载的示例
    目录场景分析 开发 总结 场景分析 在系统中一个模块有三个子模块. 业务数据中可以直接根据类型去区分这个三个子模块的归属. 通常情况下.我们是写在同一个模块中然后去选择业务类型. ...
    99+
    2022-11-12
  • Vue3解析markdown并实现代码高亮显示的详细步骤
    目录具体实现步骤如下:一、安装依赖库二、在main.js文件中引入highlight.js及样式并创建一个自定义的全局指令三、在Vue组件中应用marked解析及实现代码高亮四、显示...
    99+
    2022-11-13
  • vue+element实现动态换肤的示例代码
    有时候一个项目的主题并不能满足所有人的审美,这时候换肤功能就很友好,本项目基于vue+element实现后台管理项目的换肤功能 1.创建换肤组件 <template>...
    99+
    2022-11-12
  • ReactNative中实现动态导入的示例代码
    目录背景多业务包动态导入Metro 打包原理打包过程bundle 分析__d函数__r函数方案设计分识别入口树拆分bundle 生成合总结背景 随着业务的发展,每一个 React N...
    99+
    2022-11-13
  • 代理模式:JAVA静态代理和动态代理的实例和实现详解
    目录前言静态代理实现简述创建human接口创建接口实现类创建针对接口实现增强操作的代理代理实现效果动态代理实现简述要点:向上转型创建YoungMan接口创建两个接口实现类创建动态代理...
    99+
    2022-11-12
  • 基于Vue3实现无限滚动组件的示例代码
    目录为什么还要使用无限滚动组件无限滚动的优点无限滚动的缺点主要分为三个部分1.模拟 API 调用2.制作我们的内容组件3.显示我们的内容4.Vue3 无限滚动如果你在社交媒体上停留的...
    99+
    2022-11-13
  • Python实现动态二维码生成的示例代码
    目录1.MyQR普通的二维码制作带背景图片的二维码制作带动图背景的二维码制作2.qrcode简单的二维码制作带背景图片的二维码制作大家好,我是辰哥~ 今天给大家分享两个制作二维码的P...
    99+
    2022-11-11
  • C语言实现动态链表的示例代码
    目录结构体定义已经函数声明函数实现创建一个链表判断链表是否为空获得链表中节点的个数在某个特定的位置插入一个元素获得指定下标的节点的元素删除一个节点链表逆序链表的清空链表的销毁链表的遍...
    99+
    2022-11-13
  • SpringBoot实现动态定时任务的示例代码
    目录前言配置文件定时任务核心类提供修改cron表达式的controller前言 之前在SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文...
    99+
    2022-11-13
    SpringBoot动态定时任务 SpringBoot 定时任务
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作