美文网首页大前端Vue.js
vue+element ui 实现菜单无限极分类

vue+element ui 实现菜单无限极分类

作者: oryxtc | 来源:发表于2017-10-26 18:49 被阅读1715次

需后端返回数据结构如下:

后端实现方法可参考: 菜单栏数据递归实现

[
    {
        "id": 1,
        "parent_id": 0,
        "menu_name": "第一级菜单 1",
        "sorting": 0,
        "node": [
            {
                "id": 2,
                "parent_id": 1,
                "menu_name": "第二级菜单 1-1",
                "sorting": 0,
                "node": [
                    {
                        "id": 3,
                        "parent_id": 2,
                        "menu_name": "第三级菜单 1-1-1",
                        "sorting": 1
                    }
                ]
            }
        ]
    },
    {
        "id": 4,
        "parent_id": 0,
        "menu_name": "第一级菜单 2",
        "sorting": 0,
        "node": [
            {
                "id": 5,
                "parent_id": 4,
                "menu_name": "第二级菜单 2-1",
                "sorting": 0
            }
        ]
    }
]

新建MenuBar.vue文件,实现获取后端数据及布局功能

<template>
    <div>
        <el-radio-group v-model="isCollapse" style="margin-bottom: 20px;">
            <el-radio-button :label="false">展开</el-radio-button>
            <el-radio-button :label="true">收起</el-radio-button>
        </el-radio-group>
        <el-menu class="menu-Bar" :collapse="isCollapse">
            <MenuTree :menuData="this.menuData"></MenuTree>
        </el-menu>
    </div>
</template>
<script>
  import MenuTree from '@/components/MenuTree'

  export default {
    data () {
      return {
        isCollapse: false,
        menuData: []
      }
    },
    props: ['apiUrl'],
    created: function () {
      this.getMenu()
    },
    methods: {
      getMenu: function () {
        this.$http.get(this.apiUrl + 'menu').then(function (response) {
          this.menuData = response.data
        }, function (error) {
          console.log(error)
        })
      }
    },
    components: {
      'MenuTree': MenuTree
    }
  }
</script>
<style>
    .menu-Bar:not(.el-menu--collapse) {
        width: 200px;
        min-height: 400px;
    }
</style>

新建MenuTree.vue 实现菜单栏列的递归渲染

<template>
    <div>
        <template v-for="value in this.menuData">
            <el-submenu index="value.id" v-if="value.node">
                <template slot="title">
                    <i class="el-icon-message"></i>
                    <span slot="title">{{value.menu_name}}</span>
                </template>
                <MenuTree :menuData="value.node"></MenuTree>
            </el-submenu>
            <el-menu-item index="value.id" v-else>
                <i class="el-icon-message"></i>
                <span slot="title">{{value.menu_name}}</span>
            </el-menu-item>
        </template>
    </div>
</template>

<script>
  export default {
    props: ['menuData'],
    name: 'MenuTree'
  }
</script>

最后实现效果为

相关文章

网友评论

  • f4f7c50fc600:我也是这么做的,但是我菜单栏不能收起来,你这个菜单栏能不能收起来?。
    f4f7c50fc600:我可以加你一下扣扣嘛 我想问你一个问题,我扣扣754965020
  • 像鸣人:解决了。。。F12看了官网样式,将其复制到MenuBar.vue中,并将其中 > 去掉就可以正常隐藏了!
    原样式:
    .el-menu--collapse>.el-menu-item span, .el-menu--collapse>.el-submenu>.el-submenu__title span {
    height: 0;
    width: 0;
    overflow: hidden;
    visibility: hidden;
    display: inline-block;
    }
    修改后样式:
    .el-menu--collapse .el-menu-item span,
    .el-menu--collapse .el-submenu .el-submenu__title span {
    height: 0;
    width: 0;
    overflow: hidden;
    visibility: hidden;
    display: inline-block;
    }

    但具体原因不太清楚。。。
  • 像鸣人:你好,用这个方式实现的,折叠有子级菜单的父菜单文字是不会隐藏的,怎么解决呢?
  • 谢mingmin:合起来的时候,图标能隐藏吗
    谢mingmin:@oryxtc 不行,做成组件后,slot失效了
    oryxtc:用的elementUI, 你可以看看文档或者修改源码

本文标题: vue+element ui 实现菜单无限极分类

本文链接:https://www.haomeiwen.com/subject/tmokpxtx.html