doubleyong
管理员
管理员
  • 最后登录2026-05-10
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:6659回复:0

[vue]vue中el-submenu通过递归组件实现递归显示菜单

楼主#
更多 发布于:2020-03-04 22:19
在使用vue做动态菜单时,菜单的层级不确定,需要递归实现。vue中通过递归组件来实现
如果,el-submenu的递归实现
代码如下:
1.  上递归组件(此组件自己调用了自己)
<template>
    <div>
    <template v-for='menu in menuList'>
        <!-- 如果当前有子菜单,则显示 el-submenu ,在el-subment 里调用 递归组件 -->
        <el-submenu
                v-if='menu.children.length>0'
                :index='menu.name'
                :key="menu.id"
        >
            <template slot="title" >
                <i :class="menu.icon"></i>
                pw_menu.name
            </template>
            <!-- 调用自身  此处是重点-->
            <MenuTree :menuList='menu.children'></MenuTree>
        </el-submenu>
        <!-- 如果没有子菜单,则显示当前内容 -->
        <el-menu-item
                v-else
                :index='menu.url'
                :key='menu.id'
        >
            <i :class="menu.icon"></i>
            pw_menu.name
        </el-menu-item>
    </template>
    </div>
</template>
<script>
    export default {
        name: "MenuTree",
        props: {
            menuList: {
                type: Array,
                required: false
            }
        }
    }
</script>
<style scoped>
</style>
2.子组件菜单(Menus)--调用递归组件
<template>
        <el-scrollbar wrap-class="scrollbar-wrapper">
            <el-menu
                    router
                    mode="vertical"
                    background-color="#551A8B"
                    text-color="#FFFFFF"
                    active-text-color="#409EFF"
                    v-if="menuList"
            >
<!--                <sidebar-item v-for="menu in menuList" :key="menu.id" :item="menu" />-->
                <MenuTree :menuList="menuList"></MenuTree>
            </el-menu>
        </el-scrollbar>
</template>
<script>
    import MenuTree from "./MenuTree";
    export default {
        name:'Menus',
        components: {
            MenuTree,
        },
        props:{
            menuList: {
                type: Array,
                required: false
            }
        }
    }
</script>
<style >
    a {
        display: inline-block;
        width: 100%;
        overflow: hidden;
    }
    .el-menu {
        border: none;
        height: 100%;
        width: 100% !important;
    }
    .is-active > .el-submenu__title{
        color: #f4f4f5!important;
    }
</style>
3.父组件(App.Vue)引用
<template>
    <el-container>
        <el-header>
            XXXXXX
        </el-header>
        <el-container>
            <el-aside >
                <Menus :menuList="menuList"></Menus>
            </el-aside>
            <el-main>
                <router-view></router-view>
            </el-main>
        </el-container>
    </el-container>
</template>
<script>
    import Menus from "./views/Menus";
    export default {
        name: 'app',
        components: {
            Menus,
        },
        props: {
            menuList: {
                type: Array,
                required: false
            }
        },
        mounted(){
            this.axios.get('/menu/list')
                .then(resp => {
                    this.menuList = resp.data.menuList;
                })
        }
    }
</script>
<style>
    .el-header {
        background-color: #0000AA;
        color: #ffffff;
        line-height: 60px;
        font-size: 28px;
    }
    .el-aside {
        background-color: #e3e3e3;
        width: 200px !important;
    }
    body .el-table th.gutter{
        display: table-cell!important;
    }
    body .el-table colgroup.gutter {
        display: table-cell !important;
    }
</style>

4.总结
递归组件得重中之重,父组件与子组件、递归组件中都有共同的props,传值的过程:父组件menuList --> 菜单组件menuList --> 递归组件使用menuList
原文:https://www.cnblogs.com/theworld/p/12077418.html
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号