看过Element-UI的导航菜单组件的文档的同学应该了解到文档的demo都是有限级的菜单,然而现实场景业务通常有可能是这样子:
(1)菜单由后台接口返回;
(2)前端写死,但是业务需求是不定级别的导航菜单。下面就为实现无限级下拉导航菜单献上code!
一:实现无限级下拉的思路是:递归菜单数组数据。
二:实现操作是:组件调用自己本身从而达到实现递归菜单数据。

(1)父组件:menu.vue

// menu.vue
<el-menu
     :default-active="$route.path"  // 设置高亮当前默认的路由
     router // 设置使用 router,即默认使用vue-router来实现路由的跳转,以index做为path来跳转
     class="pci-layout-nav-menu"
     mode="horizontal"
     background-color="#000000"
     text-color="#fff"
     active-text-color="#ff9633"
 >
     <template v-for="item in menu">
         <child-menu v-if="item.children" :data="item" :key="item.name" /> // 调用子组件
         <el-menu-item v-else :index="item.route" :key="item.name">{{ item.name }}</el-menu-item>
     </template>
 </el-menu>

(2)子组件:child-menu 实现无限级下拉菜单,递归数据,组件调用自己本身完成需求。

// child-menu.vue
<template>
    <el-submenu :index="data.route">
        <template slot="title">{{ data.name }}</template>
        <template v-for="item in data.children">
            <child-menu
                v-if="item.children"
                :data="item"
                :key="item.name"
            />  // 当还有下级菜单时调用组件本身
            // 递归出口:当没有下级菜单时跳出递归,完成渲染最外面层的菜单
            <el-menu-item v-else :index="item.route" :key="item.name">{{ item.name }}</el-menu-item>
        </template>
    </el-submenu>
</template>

<script>
export default {
    name: 'child-menu',
    props: {
        data: {
            type: Object,
            default: () => {
                return {};
            }
        }
    }
};
</script>

(3)menu的数据结构参考:

// 路由只需设置最深一级菜单的即可
menu: [
		// 三级菜单
        {
            name: '菜单三',
            route: '/',
            children: [
                {
                    name: '菜单三__1',
                    route: '/',
                    children: [
                        {
                            name: '菜单三__1-1',
                            route: '/console/one'
                        },
                        {
                            name: '菜单三__1-2',
                            route: '/console/two'
                        }
                    ]
                }
            ]
        },
        {
            name: '菜单二',
            route: '/',
            children: [
                {
                    name: '菜单二__1',
                    route: '/second/one'
                },
                {
                    name: '菜单二__2',
                    route: '/second/two'
                }
            ]
        },
        // 一级菜单
        {
            name: '菜单一',
            route: '/third',
            ]
        }
    ]

以上就是使用 navMenu 组件实现无限级下拉导航菜单。
总结:
(1)实现无限级下拉的思路就是递归菜单数组,子组件调用自己本身完成递归渲染。
(2)要使用默认的vue-router完成路由跳转需要设置router,并且index属性赋值为各个菜单项的path。
(3)要默认高亮显示当前路由菜单项,需要设置default-active="$route.path"。

Logo

前往低代码交流专区

更多推荐