返回顶部
首页 > 资讯 > 前端开发 > JavaScript >el-menu动态加载路由的实现
  • 815
分享到

el-menu动态加载路由的实现

el-menu动态加载路由el-menu动态路由 2023-05-15 17:05:31 815人浏览 八月长安
摘要

先看需要实现的效果 这里有一级也有二级菜单,注意二级菜单的父目录(”选项设置“点击不会跳转,只是展开目录),然后点击去详情页,需要跳到一个隐藏的路由,不在菜

先看需要实现的效果

这里有一级也有二级菜单,注意二级菜单的父目录(”选项设置“点击不会跳转,只是展开目录),然后点击去详情页,需要跳到一个隐藏的路由,不在菜单展示的路由

还有一点要注意,就是这里有两个router-view,整个页面是一个router-view,可以由LoginView和HomeView替换(当前看到的页面),而HomeView下又有一个router-view,需要用来展示部门,系统,超时,员工设置,不合格品列表和不合格品详情页。

以上的信息均需要在数据库的表中体现

先看看直接写在代码里需要哪些操作

const routes = [
  {
    path: '',
    name: 'login',
    component: LoginView,
  }
  ,
  {
    component: HomeView,
    children: [
      {
        path: '/home',
        name: '不合格品列表',
        component: BelowStandard
      },
      {
        path: '/product/:id',
        name: '不合格品详情',
        component: BelowStandardDetail
      }
    ]
  },
  {
    component: HomeView,
    name: '选项设置',
    children: [
      {
        path: '/employee',
        name: '员工设置',
        component: EmployeeConfig,
      },
      {
        path: '/department',
        name: '部门设置',
        component: DepartmentConfig
      },
      {
        path: '/system',
        name: '系统设置',
        component: SystemConfig
      },
      {
        path: '/warn',
        name: '超时提醒',
        component: WarmConfig
      }
    ]
  },
  {
    component: HomeView,
    children: [
      {
        path: '/statistics',
        name: '统计',
        component: DailyStatistics
      }
    ]
  },
  {
    component: HomeView,
    children: [
      {
        path: '/log',
        name: '日志管理',
        component: LogManager
      }
    ]
  },
]

这是路由,当要动态从数据库加载时,就不能写在这

<el-menu
            router
            active-text-color="#ffd04b"
            background-color="#000"
            class="el-menu-vertical-demo"
            :default-active="this.$route.path"
            text-color="#fff"
            @open=""
            @close=""
        >
          <el-menu-item index="/home">
            <template #title>
              不合格品列表
            </template>
          </el-menu-item>
          <el-sub-menu index="/subMenuConfig">
            <template #title>
              选项设置
            </template>
            <el-menu-item index="/department">部门设置</el-menu-item>
            <el-menu-item index="/system">系统设置</el-menu-item>
            <el-menu-item index="/warn">超时设置</el-menu-item>
            <el-menu-item index="/employee">员工设置</el-menu-item>
          </el-sub-menu>
          <el-menu-item index="/statistics">
            <span>统计</span>
          </el-menu-item>
          <el-menu-item index="/log">
            <span>日志管理</span>
          </el-menu-item>
        </el-menu>

这是el-menu开启了路由功能,所以能跳转路由,当动态加载的时候,这部分需要改造成v-for

数据库

说明:parent_id为0的即是一级目录,但是一级目录里一部分可以直接展示界面,一部分是展开二级目录,我这是以component字段为home/HomeView.Vue来区分是展示二级目录。

现在开始写后端程序,返回菜单的JSON格式数据。

List<Menu> menuList = menuMapper.getMenuByUserId(UserUtils.getLoginUser().getId());
//根据ParentId分组
Map<Integer, List<Menu>> map = menuList.stream().collect(Collectors.groupingBy(Menu::getParentId, TreeMap::new,Collectors.toList()));
List<Menu> menus = map.get(0);//一级菜单
menus.forEach(menu->{//给有二级菜单的目录设置children属性
    List<Menu> children = map.get(menu.getId());
    menu.setChildren(children);
});
return menus;

从数据库查询到的数据格式如图,然后分一级二级菜单处理后,再返回前端

[
{
"name": "不合格品列表",
"path": "/home",
"component": "product/BelowStandard.vue",
"orderNum": 1,
"parentId": 0,
"isHidden": false,
"children": null
},
{
"name": "选项设置",
"path": "/subMenuConfig",
"component": "home/HomeView.vue",
"orderNum": 2,
"parentId": 0,
"isHidden": false,
"children": [
				{
				"name": "员工设置",
				"path": "/employee",
				"component": "config/EmployeeConfig.vue",
				"orderNum": 1,
				"parentId": 2,
				"isHidden": false,
				"children": null
				},
				{
				"name": "部门设置",
				"path": "/department",
				"component": "config/DepartmentConfig.vue",
				"orderNum": 2,
				"parentId": 2,
				"isHidden": false,
				"children": null
				},
				{
				"name": "系统设置",
				"path": "/system",
				"component": "config/SystemConfig.vue",
				"orderNum": 3,
				"parentId": 2,
				"isHidden": false,
				"children": null
				},
				{
				"name": "超时提醒",
				"path": "/warn",
				"component": "config/WarmConfig.vue",
				"orderNum": 4,
				"parentId": 2,
				"isHidden": false,
				"children": null
				}
]
},
{
"name": "统计",
"path": "/statistics",
"component": "statistics/DailyStatistics.vue",
"orderNum": 3,
"parentId": 0,
"isHidden": false,
"children": null
},
{
"name": "日志管理",
"path": "/log",
"component": "log/LogManager.vue",
"orderNum": 4,
"parentId": 0,
"isHidden": false,
"children": null
},
{
"name": "不合格品详情",
"path": "/product/:id",
"component": "product/BelowStandardDetail.vue",
"orderNum": 5,
"parentId": 0,
"isHidden": true,
"children": null
}
]

前端得到数据之后进行处理,再添加到路由,过程中遇到一个问题,vue-router4版本去掉addRoutes换成addRoute带来的问题困扰我很久

vue3就必须用Router4.x版本,由于4.0去掉了addRoutes 所以只能用addRoute

现在是只能添加一个

function routerPackag(routers:any) {
  if (routers) {
    routers.filter((itemRouter:any) => {
      if (itemRouter.component != "Layout") {
        router.addRoute('home',{ //home是父组件 add-route添加进父组件chilren里
          path: `${itemRouter.path}`,
          name: itemRouter.name,
          meta: {
            title: itemRouter.name,
          },
          component: () => import(`../views/${itemRouter.component}`),
        })
      }
      if (itemRouter.children && itemRouter.children.length) {
        routerPackag(itemRouter.children)
      }
      return true
    })
  }
}

初始化路由:

router.beforeEach((to, from, next) => {//配置路由守卫
    if(to.path==='/'){
        next()
    }else if(store.state.user.id){
        initMenus(router,store,next,to)
    }else{
        next({ path: '/',query: {redirect: to.path}});
    }
});

export const initMenus = (router, store,next,to) => {//按F5刷新的话vuex里的会被清空,长度变为0
    if (store.state.menu !== null) {
        next()
    }else {
        axiOS.get("/menu").then(response => {
            if (response) {
                let responseData = response.data
                if (responseData.flag) {
                    store.state.menu = responseData.data
                    initRoute(router,store.state)
                    next({...to,replace:true})//解决router4版本的第一次路由不匹配问题
                } else {
                    this.$ElMessage.error('请求菜单失败')
                }
            }
        })
    }
}

const initRoute = (router,state)=> {
    const loadView = view => {//这种引入方式控制台不会报警告
        // 路由懒加载
        return () => import(`@/views/${view}`)
    };
    const menus = state.menu
    const firstLevelMenu = {
        children: [],
        component: loadView('home/HomeView.vue')
    }
    menus.forEach(menu=>{
        menu.component = loadView(menu.component)
        if(menu.children === null || menu.children.length === 0){
            firstLevelMenu.children.push(menu)
        }else{
            menu.children.forEach(children=>{
                children.component = loadView(children.component)
            })
            router.addRoute(menu)
        }
    })
    router.addRoute(firstLevelMenu)
}

完成这些配置之后,路由就能动态加载了,然后取出vuex中存储的menu生成el-menu

vuex中菜单大致如图

<el-menu
    router
    active-text-color="#ffd04b"
    background-color="#000"
    class="el-menu-vertical-demo"
    :default-active="this.$route.path"
    text-color="#fff"
    @open=""
    @close=""
>
  <template v-for="route of this.$store.state.menu">
    <template v-if="route.children === null || route.children.length === 0"><!--一级菜单-->
      <template v-if="!route.isHidden">
        <el-menu-item :index = "route.path">
          <span>{{route.name}}</span>
        </el-menu-item>
      </template>
    </template>
    <template v-else><!--二级菜单-->
      <template v-if="!route.isHidden">
        <el-sub-menu :index = "route.path">
          <template #title>
            <span>{{route.name}}</span>
          </template>
          <template v-for="children of route.children">
            <template v-if="!children.isHidden">
              <el-menu-item :index = "children.path">
                <span>{{children.name}}</span>
              </el-menu-item>
            </template>
          </template>
        </el-sub-menu>
      </template>
    </template>
  </template>
</el-menu>

实现效果展示

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

--结束END--

本文标题: el-menu动态加载路由的实现

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

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

猜你喜欢
  • el-menu动态加载路由的实现
    先看需要实现的效果 这里有一级也有二级菜单,注意二级菜单的父目录(”选项设置“点击不会跳转,只是展开目录),然后点击去详情页,需要跳到一个隐藏的路由,不在菜...
    99+
    2023-05-15
    el-menu动态加载路由 el-menu动态路由
  • VUE路由动态加载如何实现
    这篇文章主要讲解了“VUE路由动态加载如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VUE路由动态加载如何实现”吧!首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多...
    99+
    2023-07-04
  • VUE中怎么实现路由动态加载
    VUE中怎么实现路由动态加载,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多,...
    99+
    2024-04-02
  • Vue中el-menu-item实现路由跳转的完整步骤
    目录场景:方法如下:补充:el-menu-item 实现水平导航栏,路由的跳转总结场景: 用了element-ui的el-menu 菜单 怎样实现路由跳转呢? 方法如下: 1,在e...
    99+
    2024-04-02
  • VUE路由动态加载的指南:揭秘动态路由背后的秘密
    1.概述 Vue 路由动态加载是指在需要时加载组件的机制,而不是在应用程序启动时一次性加载所有组件。这种方法可以显著提高应用程序的性能,尤其是对于大型应用程序。 2.实现原理 Vue 路由动态加载通过使用异步组件来实现。异步组件是一种特...
    99+
    2024-02-13
    Vue 路由 动态加载 异步组件 代码分割
  • React中怎么动态加载路由
    React中怎么动态加载路由,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。引入必要的依赖import React&n...
    99+
    2024-04-02
  • Vue路由监听实现同页面动态加载的示例
    目录场景分析 开发 总结 场景分析 在系统中一个模块有三个子模块. 业务数据中可以直接根据类型去区分这个三个子模块的归属. 通常情况下.我们是写在同一个模块中然后去选择业务类型. ...
    99+
    2024-04-02
  • VUE 路由动态加载的奥秘:揭开动态加载背后的原理
    VUE 路由动态加载是一个非常强大的功能,它允许开发者在运行时加载组件,从而实现更加灵活和动态的应用程序。VUE 路由动态加载背后的原理是使用 webpack 的代码分割功能,将应用程序的代码分成多个块,然后在需要时动态加载这些块。 w...
    99+
    2024-02-08
    VUE 动态加载 路由 组件 懒加载
  • vue怎么实现el-menu和el-tab联动
    这篇文章主要讲解了“vue怎么实现el-menu和el-tab联动”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue怎么实现el-menu和el-tab联动”吧!vue通过el-menus...
    99+
    2023-07-06
  • VUE 路由动态加载指南:一步一步掌握动态加载的精髓
    理解动态加载 动态加载是指在需要的时候才加载组件,而不是在应用程序启动时就加载所有组件。这可以显著提高应用程序的性能,尤其是在加载大量组件时。Vue 路由提供了内置的动态加载功能,使您可以轻松地实现组件的按需加载。 实现动态加载 要在 ...
    99+
    2024-02-08
    Vue 路由 动态加载 按需加载 组件 性能 用户体验
  • vue3动态添加路由
    目录前言一、初始化项目二、添加“vip”路由三、总结前言 有的时候我们需要根据不同的用户身份生成不同的路由规则,例如: vip用户应该有自己的vip页面所对应...
    99+
    2024-04-02
  • vue实现el-menu和el-tab联动的示例代码
    vue通过el-menus和el-tabs联动,实现点击侧边栏,页面内显示一行tab以及点击tab切换路由 实现效果如下 实现思路 左侧边栏添加点击事件/设置el-menu的路由...
    99+
    2023-05-15
    el-menu和el-tab联动 el-menu el-tab
  • vue动态菜单、动态路由加载以及刷新踩坑实战
    目录需求:思路:教训:分享正文:总结需求: 从接口动态获取子菜单数据 动态加载 要求只有展开才加载子菜单数据 支持刷新,页面显示正常 思路: 一开始比较乱,思路很多。想了很多 首先...
    99+
    2024-04-02
  • node后端路由自动加载怎么实现
    这篇文章主要介绍“node后端路由自动加载怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“node后端路由自动加载怎么实现”文章能帮助大家解决问题。背景今天来谈谈node后端中路由的问题。我们...
    99+
    2023-07-05
  • vue动态路由加载时出现Cannot find module xxx问题
    目录vue动态路由加载时报错Cannot find module xxxvue踩坑之旅错误信息解决方法原因分析总结vue动态路由加载时报错Cannot find module xxx...
    99+
    2023-01-10
    vue动态路由加载 Cannot find module xxx vue路由加载
  • 解决router.beforeEach()动态加载路由出现死循环问题
    目录router.beforeEach()动态加载路由出现死循环1、router.beforeEach( to , from ,next) 介绍2、两种死循环问题vue动态加载路由进...
    99+
    2024-04-02
  • Vue 动态路由的实现详情
    前言: 动态路由是一个常用的功能,根据后台返回的路由json表,前端动态显示可跳转的路由项,下面来讲解一下具体的实现方式: 大致业务需求:前端在login登陆页,输入账号密码后,点击...
    99+
    2024-04-02
  • vue实现动态路由详细
    目录一、前端控制1、在router.js文件(把静态路由和动态路由分别写在router.js) 2、store/permission.js(在vuex维护一个state,通过配角色来...
    99+
    2024-04-02
  • Vuerouter动态路由实现过程
    目录实现思路环境介绍实现过程路由数据(demo) vue动态路由(约定路由),听起来好像很玄乎的样子 但是你要是理解了实现思路,你会发现,没有想象中的那么难 在没有亲自实现功能前,永...
    99+
    2023-03-14
    Vue router动态路由 Vue动态路由
  • vue 动态添加el-input的实现逻辑
    目录一、效果图二、实现逻辑一、效果图 二、实现逻辑 将需要动态添加的表单项项的绑定值存为一个数组以循环的方式展示form表单点击`+`按钮触发事件,向数组中新加一个item点击`-...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作