首先来总结element ui 官方文档的左侧菜单结构,带有el-submenu为子级节点,el-menu-item表示没有下级。当然,菜单不能写死,因为菜单也许不止两级,所以我们需要递归来实现。根据当前节点是否有下级去判断,如果有下级,则继续调用子级,直到没有下级为止,下面我贴上左侧菜单所有的代码:

  • 请求数据格式
  1. [
  2. {
  3. name: "首页",
  4. id: -1,
  5. icon: "el-icon-picture-outline-round",
  6. url: "/index",
  7. children: []
  8. },
  9. {
  10. name: "按钮",
  11. id: 20,
  12. icon: "el-icon-message-solid",
  13. url: "/button",
  14. children: []
  15. },
  16. {
  17. name: "测试1",
  18. id: 1,
  19. icon: "el-icon-s-claim",
  20. url: "",
  21. children: [
  22. {
  23. id: 4,
  24. parentid: 1,
  25. name: "测试1-1",
  26. icon: "el-icon-chat-dot-round",
  27. url: "",
  28. children: [
  29. {
  30. id: 8,
  31. parentid: 1,
  32. name: "测试1-1-1",
  33. icon: "el-icon-cloudy",
  34. url: "/test",
  35. children: []
  36. },
  37. {
  38. id: 9,
  39. parentid: 1,
  40. name: "测试1-1-2",
  41. icon: "el-icon-files",
  42. url: "/test1",
  43. children: []
  44. }
  45. ]
  46. },
  47. {
  48. id: 5,
  49. parentid: 1,
  50. name: "测试1-2",
  51. icon: "el-icon-shopping-cart-1",
  52. url: "/test3",
  53. children: []
  54. }
  55. ]
  56. },
  57. {
  58. name: "测试2",
  59. id: 2,
  60. icon: "el-icon-menu",
  61. url: "",
  62. children: [
  63. {
  64. id: 6,
  65. parentid: 2,
  66. name: "测试2-1",
  67. icon: "el-icon-folder-checked",
  68. url: "",
  69. children: []
  70. },
  71. {
  72. id: 7,
  73. parentid: 2,
  74. name: "测试2-2",
  75. icon: "el-icon-folder-remove",
  76. url: "",
  77. children: []
  78. }
  79. ]
  80. },
  81. {
  82. name: "测试3",
  83. id: 3,
  84. icon: "el-icon-monitor",
  85. url: "",
  86. children: []
  87. }
  88. ]
  • menu.vue
  1. <template>
  2. <div class="menu">
  3. <div class="logo-con">
  4. <div class="title" v-show="!collapse">
  5. <span class="title__sider-title is-active">{{logo}}</span>
  6. </div>
  7. <div class="title" v-show="collapse">
  8. <span class="title__sider-title el-tag--mini">LG</span>
  9. </div>
  10. </div>
  11. <el-menu
  12. :background-color="backgroundColor"
  13. :text-color="textColor"
  14. :default-active="$route.meta.pageId"
  15. :collapse="collapse"
  16. >
  17. <template v-for="item in list">
  18. <router-link :to="item.url" :key="item.id" v-if="item.children.length===0">
  19. <el-menu-item :index="item.id.toString()">
  20. <i :class="item.icon"></i>
  21. <span slot="title">{{item.name}}</span>
  22. </el-menu-item>
  23. </router-link>
  24. <subMenu v-else :data="item" :key="item.id"></subMenu>
  25. </template>
  26. </el-menu>
  27. </div>
  28. </template>
  29.  
  30. <script>
  31. import subMenu from "./subMenu";
  32. export default {
  33. name: "menuList",
  34. components: {
  35. subMenu
  36. },
  37. data() {
  38. return {
  39. collapse: false, //是否折叠
  40. list: [], //当行菜单数据源
  41. backgroundColor: "#304156", //导航菜单背景颜色
  42. textColor: "#BFCBD9", //导航菜单文字颜色
  43. logo: "LOGO" //logo
  44. };
  45. }
  46. };
  47. </script>
  48.  
  49. <style lang="scss" scoped>
  50. .el-menu {
  51. border-right: none;
  52. a {
  53. text-decoration: none;
  54. }
  55. }
  56. .logo-con {
  57. height: 64px;
  58. padding: 10px;
  59.  
  60. .title {
  61. position: relative;
  62. text-align: center;
  63. font-size: 20px;
  64. height: 64px;
  65. line-height: 64px;
  66.  
  67. span {
  68. padding: 0 5px 0 0;
  69. color: #409eff;
  70. font-size: 20px;
  71. }
  72. }
  73. }
  74. </style>
  • submenu.vue

   这里有个知识点functional,不懂自行百度,文档地址:https://cn.vuejs.org/v2/guide/render-function.html#search-query-sidebar

  1.  
  2. <!--
  3. * @Description:
  4. * @Author: PengYH
  5. * @Date: 2019-08-06
  6. -->
  7. <template functional>
  8. <el-submenu :index="props.data.id.toString()">
  9. <template slot="title">
  10. <i :class="props.data.icon"></i>
  11. <span>{{props.data.name}}</span>
  12. </template>
  13. <template v-for="item in props.data.children">
  14. <router-link :to="item.url" :key="item.id" v-if="item.children.length===0">
  15. <el-menu-item class="subitem" :index="item.id.toString()">
  16. <i :class="item.icon"></i>
  17. <span slot="title">{{item.name}}</span>
  18. </el-menu-item>
  19. </router-link>
  20. <sub-menu v-else :data="item" :key="item.id"></sub-menu>
  21. </template>
  22. </el-submenu>
  23. </template>
  24.  
  25. <script>
  26. export default {
  27. name: "submenu",
  28. props: {
  29. data: [Array, Object]
  30. }
  31. };
  32. </script>
  33.  
  34. <style lang="scss" scoped>
  35. .el-submenu {
  36. .el-menu-item {
  37. padding: 0;
  38. }
  39. }
  40. </style>
  • 效果图

vue生成element左侧菜单的更多相关文章

  1. vue 首页导航+左侧菜单

    1. Mock.js 前后端分离开发开发过程当中,经常会遇到以下几个尴尬的场景: 1. 老大,接口文档还没输出,我的好多活干不下去啊! 2. 后端小哥,接口写好了没,我要测试啊! 前后端分离之后,前端 ...

  2. 使用layui-tree美化左侧菜单,点击生成tab选项

    layui-tree美化左侧菜单 html <div class="layui-side layui-bg-black"> <div class="la ...

  3. SPA项目开发之首页导航+左侧菜单

    Mock.js: 前后端分离之后,前端迫切需要一种机制,不再需要依赖后端接口开发,而mockjs就可以做到这一点 Mock.js是一个模拟数据的生成器,用来帮助前端调试开发.进行前后端的原型分离以及用 ...

  4. LayUI左侧菜单无法保持选中状态

    1.问题描述:一般的左侧菜单都会是动态添加的模块,利用循环把模块名和链接地址逐个显示出来如下图 但是问题来了,只要点任何二级菜单就不会保持左侧菜单当前一级菜单和二级菜单选中状态. 2.分析原因:因为模 ...

  5. 【vue】vue使用Element组件时v-for循环里的表单项验证方法

    转载至:https://www.jb51.net/article/142750.htm标题描述看起来有些复杂,有vue,Element,又有表单验证,还有v-for循环?是不是有点乱?不过我相信开发中 ...

  6. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

  7. vue、iview动态菜单(可折叠)

    vue项目与iview3实现可折叠动态菜单. 菜单实现一下效果: 动态获取项目路由生成动态三级菜单导航 可折叠展开 根据路由name默认打开子目录,选中当前项 自动过滤需要隐藏的路由(例:登陆) 在手 ...

  8. Vue3教程:Vue 3 + Element Plus + Vite 2 的后台管理系统开源啦

    之前发布过一篇文章<Vue3教程:开发一个 Vue 3 + element-plus 的后台管理系统>,文中提到会开发并开源一个 Vue 3 + Element Plus 的项目供大家练手 ...

  9. python : jquery实现左侧菜单

    左侧菜单 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3 ...

随机推荐

  1. shell的用处到底大不大

    我曾在智联招聘等网站上搜寻有关shell脚本员的职位,与C++.JAVA等热门语言相比,冷清很多.看上去似乎招shell程序员的公司比较少.是不是公司不重视或者是很少用到shell这个东东呢?     ...

  2. STM32F0_HAL库驱动描述——LL驱动程序概述

    LL驱动概述 低层(LL)驱动器旨在提供快速轻量级的专家导向层,它比硬件更接近硬件: 与HAL相反,LLAPI不适用于优化访问不是关键功能的外设设备,或者需要大量软件配置和/或复杂的高级堆栈(如USB ...

  3. RabbitMQ实战(三)-高级特性

    0 相关源码 1 你将学到 如何保证消息百分百投递成功 幂等性 如何避免海量订单生成时消息的重复消费 Confirm确认消息.Return返回消息 自定义消费者 消息的ACK与重回队列 限流 TTL ...

  4. 关于java爬虫以及一些实例

    首先是工具介绍 Jsoup jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法 ...

  5. [小米OJ] 9. 移除 K 位得到最小值

    思路: 重复k次: 1.找到并且删除第一个 num[i] > num[i+1] 的第i位数字. 2.若删除过程中,序列变成递增序列,则直接删除最后一位. 注意除去字符串头的0 def solut ...

  6. [leetcode] 22. Generate Parentheses(medium)

    原题 思路: 利用DFS,搜索每一种情况,同时先加"("后加")",保证()匹配正确. 最近开始学习前端,尝试用js来写. const generate = f ...

  7. tomcat用做图片服务器

    最近做了个小网站,就是用tinyce富文本编辑器,https://www.511easy.com/ 保持字体排版和图片 发现博客园的图片,一天之后就无法显示 就想着自己做一个图片服务器,上传图片到指定 ...

  8. python带有GIL解释器锁

    1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2.每个CPU在同一时间只能执行一个线程(在 ...

  9. vue项目目录结构详解

    项目简介基于 vue.js 的前端开发环境,用于前后端分离后的单页应用开发,可以在开发时使用 ES Next.scss 等最新语言特性.项目包含: 基础库: vue.js.vue-router.vue ...

  10. jsp对数据库的使用

    JDBC由Sun公司制定,全称JavaDataBase Connectivity,是一种可以执行SQL语句并可返回结果的javaAPI,支持多种关系型数据库,封装在Java.sql.* 它的具体位置在 ...