vue element 生成无线级左侧菜单的实现代码


Posted in Javascript onAugust 21, 2019

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

请求数据格式

[
   {
    name: "首页",
    id: -1,
    icon: "el-icon-picture-outline-round",
    url: "/index",
    children: []
   },
   {
    name: "按钮",
    id: 20,
    icon: "el-icon-message-solid",
    url: "/button",
    children: []
   },
   {
    name: "测试1",
    id: 1,
    icon: "el-icon-s-claim",
    url: "",
    children: [
     {
      id: 4,
      parentid: 1,
      name: "测试1-1",
      icon: "el-icon-chat-dot-round",
      url: "",
      children: [
       {
        id: 8,
        parentid: 1,
        name: "测试1-1-1",
        icon: "el-icon-cloudy",
        url: "/test",
        children: []
       },
       {
        id: 9,
        parentid: 1,
        name: "测试1-1-2",
        icon: "el-icon-files",
        url: "/test1",
        children: []
       }
      ]
     },
     {
      id: 5,
      parentid: 1,
      name: "测试1-2",
      icon: "el-icon-shopping-cart-1",
      url: "/test3",
      children: []
     }
    ]
   },
   {
    name: "测试2",
    id: 2,
    icon: "el-icon-menu",
    url: "",
    children: [
     {
      id: 6,
      parentid: 2,
      name: "测试2-1",
      icon: "el-icon-folder-checked",
      url: "",
      children: []
     },
     {
      id: 7,
      parentid: 2,
      name: "测试2-2",
      icon: "el-icon-folder-remove",
      url: "",
      children: []
     }
    ]
   },
   {
    name: "测试3",
    id: 3,
    icon: "el-icon-monitor",
    url: "",
    children: []
   }
  ]

menu.vue

<template>
 <div class="menu">
  <div class="logo-con">
   <div class="title" v-show="!collapse">
    <span class="title__sider-title is-active">{{logo}}</span>
   </div>
   <div class="title" v-show="collapse">
    <span class="title__sider-title el-tag--mini">LG</span>
   </div>
  </div>
  <el-menu
   :background-color="backgroundColor"
   :text-color="textColor"
   :default-active="$route.meta.pageId"
   :collapse="collapse"
  >
   <template v-for="item in list">
    <router-link :to="item.url" :key="item.id" v-if="item.children.length===0">
     <el-menu-item :index="item.id.toString()">
      <i :class="item.icon"></i>
      <span slot="title">{{item.name}}</span>
     </el-menu-item>
    </router-link>
    <subMenu v-else :data="item" :key="item.id"></subMenu>
   </template>
  </el-menu>
 </div>
</template>

<script>
import subMenu from "./subMenu";
export default {
 name: "menuList",
 components: {
  subMenu
 },
 data() {
  return {
   collapse: false, //是否折叠
   list: [], //当行菜单数据源
   backgroundColor: "#304156", //导航菜单背景颜色
   textColor: "#BFCBD9", //导航菜单文字颜色
   logo: "LOGO" //logo
  };
 }
};
</script>

<style lang="scss" scoped>
.el-menu {
 border-right: none;
 a {
  text-decoration: none;
 }
}
.logo-con {
 height: 64px;
 padding: 10px;

 .title {
  position: relative;
  text-align: center;
  font-size: 20px;
  height: 64px;
  line-height: 64px;

  span {
   padding: 0 5px 0 0;
   color: #409eff;
   font-size: 20px;
  }
 }
}
</style>

submenu.vue

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

5 <!--
 * @Description: 
 * @Author: PengYH
 * @Date: 2019-08-06
 -->
<template functional>
 <el-submenu :index="props.data.id.toString()">
  <template slot="title">
   <i :class="props.data.icon"></i>
   <span>{{props.data.name}}</span>
  </template>
  <template v-for="item in props.data.children">
   <router-link :to="item.url" :key="item.id" v-if="item.children.length===0">
    <el-menu-item class="subitem" :index="item.id.toString()">
     <i :class="item.icon"></i>
     <span slot="title">{{item.name}}</span>
    </el-menu-item>
   </router-link>
   <sub-menu v-else :data="item" :key="item.id"></sub-menu>
  </template>
 </el-submenu>
</template>
<script>
export default {
 name: "submenu",
 props: {
  data: [Array, Object]
 }
};
</script>
<style lang="scss" scoped>
.el-submenu {
 .el-menu-item {
  padding: 0;
 }
}
</style>

效果图

vue element 生成无线级左侧菜单的实现代码

总结

以上所述是小编给大家介绍的vue element 生成无线级左侧菜单的实现代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时会及时回复大家的!

Javascript 相关文章推荐
兼容Mozilla必须知道的知识。
Jan 09 Javascript
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
javascript模拟select,jselect的方法实现
Nov 08 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 Javascript
javascript图像处理—仿射变换深度理解
Jan 16 Javascript
js正则表达式中exec用法实例
Jul 23 Javascript
jquery.zclip轻量级复制失效问题
Jan 08 Javascript
微信小程序学习(4)-系统配置app.json详解
Jan 12 Javascript
详解node中创建服务进程
May 09 Javascript
详解angularjs中如何实现控制器和指令之间交互
May 31 Javascript
vue实现微信获取用户信息的方法
Mar 21 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
Aug 23 Javascript
微信小程序仿今日头条导航栏滚动解析
Aug 20 #Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
Aug 20 #Javascript
Vue formData实现图片上传
Aug 20 #Javascript
Angular8 Http拦截器简单使用教程
Aug 20 #Javascript
vue实现axios图片上传功能
Aug 20 #Javascript
扫微信小程序码实现网站登陆实现解析
Aug 20 #Javascript
vue+element-ui+axios实现图片上传
Aug 20 #Javascript
You might like
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
jQuery利用FormData上传文件实现批量上传
2018/12/04 jQuery
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
基于Django的ModelForm组件(详解)
2017/12/07 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
python写程序统计词频的方法
2019/07/29 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
会计实习自我鉴定
2013/12/04 职场文书
计算机专业学生求职信分享
2013/12/15 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
服务标语口号
2014/07/01 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
学校标语口号大全
2015/12/26 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python