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 相关文章推荐
jQuery的运行机制和设计理念分析
Apr 05 Javascript
使图片旋转的3种解决方案
Nov 21 Javascript
自己实现ajax封装示例分享
Apr 01 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
Oct 21 Javascript
js跨域问题浅析及解决方法优缺点对比
Nov 08 Javascript
jquery.cookie实现的客户端购物车操作实例
Dec 24 Javascript
总结js函数相关知识点
Feb 27 Javascript
vue单页应用在页面刷新时保留状态数据的方法
Sep 21 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
Oct 11 Javascript
详解如何使用nvm管理Node.js多版本
May 06 Javascript
JS如何寻找数组中心索引过程解析
Jun 01 Javascript
JS数组索引检测中的数据类型问题详解
Jan 11 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 过滤危险html代码
2009/06/29 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
php array_multisort 对数组进行排序详解及实例代码
2016/10/27 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python基于PycURL实现POST的方法
2015/07/25 Python
Python中return语句用法实例分析
2015/08/04 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
python 实现兔子生兔子示例
2019/11/21 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
一年级家长会邀请函
2014/01/25 职场文书
给老师的一封建议书
2014/03/13 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
公司合并协议书范本
2014/09/30 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
教师工作态度自我评价
2015/03/05 职场文书
2015年检验科工作总结
2015/04/27 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
欢迎新生标语2015
2015/07/16 职场文书