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 相关文章推荐
自动更新作用
Oct 08 Javascript
JavaScript 垃圾回收机制分析
Oct 10 Javascript
JavaScript将页面表格导出为Excel的具体实现
Dec 27 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
Jul 22 Javascript
bootstrap实现弹窗和拖动效果
Jan 03 Javascript
Bootstrap模仿起筷首页效果
May 09 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
Aug 16 Javascript
Js实现京东无延迟菜单效果实例(demo)
Jun 02 Javascript
基于webpack.config.js 参数详解
Mar 20 Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 Javascript
Vue修改项目启动端口号方法
Nov 07 Javascript
微信小程序拖拽排序列表的示例代码
Jul 08 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显示Facebook的粉丝数量方法
2014/01/08 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
解决DataFrame排序sort的问题
2018/06/07 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
django中的数据库迁移的实现
2020/03/16 Python
使用Python实现批量ping操作方法
2020/05/06 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
Weblogc domain问题
2014/01/27 面试题
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
最热门的自我评价
2013/12/30 职场文书
委托培训协议书
2014/11/17 职场文书
优秀班主任材料
2014/12/16 职场文书
2015年护士节活动总结
2015/02/10 职场文书
JS中如何优雅的使用async await详解
2021/10/05 Javascript