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 相关文章推荐
Javascript 跨域访问解决方案
Feb 14 Javascript
jquery tools系列 expose 学习
Sep 06 Javascript
window.location不跳转的问题解决方法
Apr 17 Javascript
AngularJS快速入门
Apr 02 Javascript
AngularJS辅助库browserTrigger用法示例
Nov 03 Javascript
JavaScript数据结构链表知识详解
Nov 21 Javascript
jQuery实现联动下拉列表查询框
Jan 04 Javascript
js如何获取网页所有图片
May 12 Javascript
利用vue开发一个所谓的数独方法实例
Dec 21 Javascript
详解微信小程序与内嵌网页交互实现支付功能
Oct 22 Javascript
详解小程序input框失焦事件在提交事件前的处理
May 05 Javascript
Javascript使用integrity属性进行安全验证
Nov 07 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下网站防IP攻击代码,超级实用
2010/10/24 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
js原型链原理看图说明
2012/07/07 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
scrollWidth,clientWidth,offsetWidth的区别
2015/01/13 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
2018/05/16 Javascript
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
python的scipy实现插值的示例代码
2019/11/12 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
vivo智能手机官方商城:vivo
2016/09/22 全球购物
学生个人求职自荐信格式
2013/09/23 职场文书
委托书模板
2014/04/04 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
经济国贸专业求职信
2014/06/18 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
酒店前台辞职书
2015/02/26 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
商业计划书格式、范文
2019/03/21 职场文书