广告
返回顶部
首页 > 资讯 > 精选 >怎么使用el-menu递归实现多级菜单组件
  • 932
分享到

怎么使用el-menu递归实现多级菜单组件

2023-07-06 01:07:05 932人浏览 独家记忆
摘要

今天小编给大家分享一下怎么使用el-menu递归实现多级菜单组件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 效果:2

今天小编给大家分享一下怎么使用el-menu递归实现多级菜单组件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1. 效果:

怎么使用el-menu递归实现多级菜单组件

怎么使用el-menu递归实现多级菜单组件

怎么使用el-menu递归实现多级菜单组件

2. 实现:

创建外层菜单AsideMenu.Vue组件和子菜单项AsideSubMenu.vue组件,在AsideSubMenu中进行递归操作。

AsideMenu.vue文件内容如下:

<template>  <aside class="wrap">    <el-menu      :default-active="activeMenu"      router      :class="'menu-left'"      :default-openeds="openedsArr"      text-color="#fff"    >      <AsideSubMenu :menuData="menuData"></AsideSubMenu>    </el-menu>  </aside></template> <script>import AsideSubMenu from "./AsideSubMenu.vue";export default {  name: "AsideMenu",  components: {    AsideSubMenu,  },  props: {    menuData: {      type: Array,    },  },  computed: {    activeMenu() {      const route = this.$route;      const { meta, path } = route;      // 此处添加判断的原因见说明      if (meta.matchPath) {        return meta.matchPath;      } else {        return path;      }    },    // 设置默认展开菜单项    openedsArr() {      // const arr = this.menuData.map((item) => {      //   return item.title;      // });      // return arr;      return [];    },  },};</script>

判断高亮状态的activeMenu方法中的判断matchPath属性可以让多个路由不同的页面匹配同一个菜单高亮状态,因为菜单高亮状态是根据路由地址匹配的。如果两个不同的路由页面想公用同一个菜单高亮状态(如详情页面和列表页)就可以使用该方法实现。在router文件里设置meta对象,添加matchPath属性设置为想要共用的高亮状态的页面的路由地址。(有点绕????)

样式根据需求修改,示例中的样式如下(此处包含深浅两种主题的菜单样式):

<style scoped>aside {  height: 100%;  text-align: center;}.el-menu {  padding: 16px;  box-sizing: border-box;}.menu-left,.menu-left /deep/ .el-menu {  min-height: 100%;  background-color: #222653;}.menu-left .icon {  width: 20px;  margin-right: 9px;}.menu-left /deep/.el-submenu__title,.menu-left /deep/.el-menu-item {  box-sizing: border-box;  font-size: 14px;  font-family: PingFangSC-Regular, PingFang SC;  text-align: left;  color: #b3c0e7 !important;  background-color: #222653 !important;}.menu-left /deep/.el-submenu__title i {  color: #b3c0e7 !important;}.menu-left /deep/.el-submenu__title {  height: 54px;  line-height: 54px;  }.menu-left /deep/ .el-menu-item {  height: 52px;  line-height: 52px;}.menu-left /deep/.el-submenu .el-menu-item {  padding-left: 45px !important;}.menu-left /deep/.el-submenu.is-active,.menu-left /deep/.el-submenu.is-active .el-menu-item,.menu-left /deep/.el-submenu.is-active .el-submenu__title,.menu-left /deep/.el-menu-item.is-active {  background-color: #4880ff !important;}.menu-left /deep/.el-submenu.is-active {  border-radius: 10px;  overflow: hidden;}.menu-left /deep/ .el-menu-item.is-active {  border-radius: 10px;}.menu-left /deep/ .el-menu--inline .el-menu-item.is-active,.menu-left /deep/ .el-submenu.noIcon {  border-radius: 0;}.menu-left /deep/ .el-submenu.noIcon .el-submenu__title {  padding-left: 45px !important;}.menu-left /deep/ .el-submenu.noIcon .el-menu-item {  padding-left: 58px !important;}.menu-left /deep/.el-submenu.is-active > .el-submenu__title,.menu-left /deep/.el-submenu.is-active > .el-submenu__title i {  color: #ffffff !important;}.menu-left /deep/.el-menu-item:focus,.menu-left /deep/.el-menu-item:hover,.menu-left /deep/.el-menu-item.is-active {  color: #ffffff !important;  font-weight: 500;}.menu-left /deep/.el-menu-item.is-disabled {  padding-left: 45px !important;  color: #ffffff !important;} .menu-left-light {  height: 100%;  background-color: #f8f8f8;}.menu-left-light .icon {  width: 20px;  margin-right: 9px;}.menu-left-light /deep/.el-submenu__title,.menu-left-light /deep/.el-menu-item {  box-sizing: border-box;  font-size: 16px;  font-family: PingFangSC-Regular, PingFang SC;  text-align: left;  color: #333333;}.menu-left-light /deep/.el-submenu__title {  height: 52px;  line-height: 52px;  padding-left: 56px !important;}.menu-left-light /deep/.el-submenu__title:hover {  background-color: #ffffff !important;}.menu-left-light /deep/.el-submenu__icon-arrow {  right: 85px;}.menu-left-light /deep/.el-submenu__title i {  color: #333333;}.menu-left-light /deep/.el-menu-item {  height: 40px;  line-height: 40px;  padding-left: 82px !important;  border-left: 4px solid #ffffff;}.menu-left-light /deep/.el-menu-item:focus,.menu-left-light /deep/.el-menu-item:hover,.menu-left-light /deep/.el-menu-item.is-active {  background: rgba(31, 65, 219, 0.1) !important;  color: #1f41db !important;  border-color: #1f41db;}.menu-left-light /deep/.el-menu-item.is-disabled {  background: #ffffff !important;  color: #333333 !important;}</style>

AsideMenu.vue文件内容如下:

<template>  <div>    <template v-for="item in menuData">      <el-submenu        :key="item.path"        v-if="item.children && item.children.length > 0"        :index="item.path"        :class="item.icon ? '' : 'noIcon'"      >        <template slot="title">          <img            class="icon mr-r-10"            :src="              curRoute.indexOf(item.path) != -1 ? item.iconActive : item.icon            "          />          <span>{{ item.title }}</span>        </template>        <AsideSubMenu :menuData="item.children"></AsideSubMenu>      </el-submenu>      <el-menu-item        :key="item.id"        v-else        :index="item.path"        :disabled="item.disabled"      >        <template slot="title">          <img            class="icon mr-r-10"            :src="              curRoute.indexOf(item.path) != -1 ? item.iconActive : item.icon            "          />          <span>{{ item.title }}</span>        </template>      </el-menu-item>    </template>  </div></template>

判断如果有子菜单则进行遍历操作。同时此处根据是否有icon给el-submenu动态添加了一个类名:class="item.icon ? '' : 'noIcon'",这么做是由于高亮状态下的.el-submenu添加了圆角效果,在存在多层子菜单嵌套的情况下如果不清除圆角效果则会出现问题(见下图)。这个状态下不好用选择器选中需要操作的元素,因此根据是否有icon这个区别进行了区分。如果是整个菜单都没有icon的情况的话,那暂时还没想好应对策略。????

怎么使用el-menu递归实现多级菜单组件

<script>import AsideSubMenu from "./AsideSubMenu.vue";export default {  name: "AsideSubMenu",  components: {    AsideSubMenu,  },  props: {    menuData: {      type: Array,      default: () => {        return [];      },    },  },  computed: {    curRoute() {      return this.$route.path;    },  },};</script>

3. 使用组件:

  • 添加路由配置;

  • 引入并挂载组件;

  • 传入菜单数据;

代码如下:

<template>  <el-container class="container">    <el-aside width="320px">      <AsideMenu :menuData="menuData"></AsideMenu>    </el-aside>    <el-main>      <keep-alive :exclude="[]">        <router-view></router-view>      </keep-alive>    </el-main>  </el-container></template> <script>import AsideMenu from '@/components/AsideMenu.vue';export default {  name: 'MenuTest',  components: {    AsideMenu  },  data() {    return {      menuData: [        {          title: '菜单一',          path: '/menutest/menu1',          icon: require('@/assets/icons/apply.svg'),          iconActive: require('@/assets/icons/apply_active.svg'),          children: [            {              title: '子菜单一',              path: '/menutest/menu1/menu1-1',              // disabled: true,            },            {              title: '子菜单二',              path: '/menutest/menu1/menu1-2'            }          ]        },        {          title: '菜单二',          path: '/menutest/menu2',          icon: require('@/assets/icons/apply.svg'),          iconActive: require('@/assets/icons/apply_active.svg'),          children: [            {              title: '子菜单一',              path: '/menutest/menu2/menu2-1'            },            {              title: '子菜单二',              path: '/menutest/menu2/menu2-2',              children: [                {                  title: '孙子菜单一',                  path: '/menutest/menu2/menu2-2/menu2-1-1'                },                {                  title: '孙子菜单二',                  path: '/menutest/menu2/menu2-2/menu2-2-2'                }              ]            },            {              title: '子菜单三',              path: '/menutest/menu2/menu2-3'            }          ]        },        {          title: '菜单三',          path: '/menutest/menu3',          icon: require('@/assets/icons/apply.svg'),          iconActive: require('@/assets/icons/apply_active.svg'),        }      ]    };  }};</script> <style scoped>.container {  min-height: 800px;}.el-main {  padding: 32px 40px;  box-sizing: border-box;  background: #f5f5fa;  overflow-y: auto;}</style>

示例中的路由配置如下:

  {    path: "/menutest",    name: "Menu",    component: () => import("../views/MenuTest.vue"),    redirect: "/menutest/menu1",    children: [{        path: '/menutest/menu1',        component: () => import("../views/menuPages/menu1.vue"),        children: [{            path: '/menutest/menu1/menu1-1',            component: () => import("../views/menuPages/menu1-1.vue"),          },          {            path: '/menutest/menu1/menu1-2',            component: () => import("../views/menuPages/menu1-2.vue"),          }        ]      },      {        path: '/menutest/menu2',        component: () => import("../views/menuPages/menu2.vue"),        children: [{            path: '/menutest/menu2/menu2-1',            component: () => import("../views/menuPages/menu2-1.vue"),          },          {            path: '/menutest/menu2/menu2-2',            component: () => import("../views/menuPages/menu2-2.vue"),            children: [{                path: '/menutest/menu2/menu2-2/menu2-1-1',                component: () => import("../views/menuPages/menu2-1-1.vue"),              },              {                path: '/menutest/menu2/menu2-2/menu2-2-2',                component: () => import("../views/menuPages/menu2-1-2.vue"),              }            ]          },          {            path: '/menutest/menu2/menu2-3',            component: () => import("../views/menuPages/menu2-3.vue"),          }        ]      },      {        path: '/menutest/menu3',        component: () => import("../views/menuPages/menu3.vue"),      }    ]  }

以上就是“怎么使用el-menu递归实现多级菜单组件”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: 怎么使用el-menu递归实现多级菜单组件

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

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

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

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

下载Word文档
猜你喜欢
  • 怎么使用el-menu递归实现多级菜单组件
    今天小编给大家分享一下怎么使用el-menu递归实现多级菜单组件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 效果:2...
    99+
    2023-07-06
  • el-menu递归实现多级菜单组件的示例
    目录1. 效果:2. 实现:3. 使用组件:1. 效果: 2. 实现: 创建外层菜单AsideMenu.vue组件和子菜单项AsideSubMenu.vue组件,在AsideS...
    99+
    2023-05-15
    el-menu多级菜单 el-menu递归菜单
  • vue递归组件怎么实现elementUI多级菜单
    这篇“vue递归组件怎么实现elementUI多级菜单”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue递归组件怎么实现e...
    99+
    2023-07-02
  • vue递归组件实现elementUI多级菜单
     本文实例为大家分享了vue递归组件实现elementUI多级菜单的具体代码,供大家参考,具体内容如下 先看效果: 一、子组件 <template>     ...
    99+
    2022-09-27
  • Vue3 Element-plus和el-menu无限级菜单组件怎么封装
    对于element中提供给我们的el-menu组件最多可以实现三层嵌套,如果多一层数据只能自己通过变量去加一层,如果加了两层、三层这种往往是行不通的,所以只能进行封装效果图 一、定义数据MenuData.tsexport default [...
    99+
    2023-05-14
    Vue3 Element-plus el-menu
  • 怎么使用el-upload组件实现递归多文件上传
    本篇内容介绍了“怎么使用el-upload组件实现递归多文件上传”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、需求描述:在页面上点击按钮...
    99+
    2023-07-05
  • 怎么使用Vue递归组件实现树形菜单
    本文小编为大家详细介绍“怎么使用Vue递归组件实现树形菜单”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Vue递归组件实现树形菜单”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下图,点击后打开二级...
    99+
    2023-07-04
  • vue+quasar使用递归实现动态多级菜单
    本文实例为大家分享了vue+quasar使用递归实现动态多级菜单的具体代码,供大家参考,具体内容如下 效果图: 菜单初始化入口 menu.vue,初始化侧边栏菜单组建,<my...
    99+
    2022-11-13
  • Vue.js中怎么利用递归组件构建树形菜单
    本篇文章给大家分享的是有关Vue.js中怎么利用递归组件构建树形菜单,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在Vue.js中一个递归组件...
    99+
    2022-10-19
  • 使用CSS怎么实现多级菜单
    这期内容当中小编将会给大家带来有关使用CSS怎么实现多级菜单,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。<ul id="menu">  &l...
    99+
    2023-06-08
  • Vue.js中怎么利用递归组件实现一个可折叠的树形菜单
    本篇文章给大家分享的是有关Vue.js中怎么利用递归组件实现一个可折叠的树形菜单,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在Vue.js中...
    99+
    2022-10-19
  • 怎么使用vue递归实现树形组件
    这篇文章主要介绍“怎么使用vue递归实现树形组件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用vue递归实现树形组件”文章能帮助大家解决问题。1. 先来看一下效果:2. 代码部分 (myTr...
    99+
    2023-07-02
  • Vue下如何用递归组件实现一个可折叠的树形菜单
    这篇文章主要介绍“Vue下如何用递归组件实现一个可折叠的树形菜单”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue下如何用递归组件实现一个可折叠的树形菜单”文章能帮助大家解决问题。在Vue.js中...
    99+
    2023-07-04
  • 怎么使用Java递归实现评论多级回复功能
    这篇文章主要介绍“怎么使用Java递归实现评论多级回复功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Java递归实现评论多级回复功能”文章能帮助大家解决问题。评论实体数据库存储字段: i...
    99+
    2023-07-02
  • 怎么使用php递归实现无限级分类
    使用PHP递归实现无限级分类的步骤如下:1. 创建一个数组或从数据库中获取分类数据,包含id和parent_id字段,表示分类的唯一...
    99+
    2023-09-29
    php
  • 怎么使用Vue组件tree实现树形菜单
    本篇内容主要讲解“怎么使用Vue组件tree实现树形菜单”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Vue组件tree实现树形菜单”吧!vue 编写的树形菜单,小巧实用,支持vue1....
    99+
    2023-07-04
  • 怎么使用JS实现三级联动菜单
    这篇“怎么使用JS实现三级联动菜单”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用J...
    99+
    2022-10-19
  • 使用Ajax怎么实现一个二级联动菜单
    本篇文章为大家展示了使用Ajax怎么实现一个二级联动菜单,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。index.jsp<%@ page language="ja...
    99+
    2023-06-08
  • Element怎么使用el-table组件实现二次封装
    这篇文章主要讲解了“Element怎么使用el-table组件实现二次封装”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Element怎么使用el-table组件实现二次封装”吧!一、安装引...
    99+
    2023-07-02
  • 使用JavaScript怎么实现一个单文件组件
    使用JavaScript怎么实现一个单文件组件?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript是什么JavaScript是一种直译式的脚本语言...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作