element-plus 的 el-menu 菜单组件,功能非常强大,支持n级菜单、图标等等功能。如果菜单是静态的,直接手撸的话,那么按照官网实例即可,但是如果需要基于json动态绑定,而且还是n级菜单,那么要怎么办呢?
分析菜单
el-menu 由 子菜单、菜单项组成(先不考虑分组的问题),子菜单可以看做是树枝,菜单项可以看做是树叶,子菜单可以包含子菜单和菜单项,菜单项不能包含。
定义结构
// 定义菜单 const myMenu = reactive([ { menuId: '1', text: 'vue', children: [ { menuId: '11', text: '组件1', children: [ { menuId: '111', text: '组件11' } ] } ] }, { menuId: '2', text: 'reacte' } ])
一种常见的分组结构,可以加上icon的信息。
写个递归组件
准备工作完成后,我们写一个递归组件即可
<template v-for="(item, index) in subMenu" > <!--树枝--> <template v-if="item.children"> <el-sub-menu :key="item.menuId + '_' + index" :index="item.menuId" > <template #title> <component :is="" style="width: 1.5em; height: 1.5em; margin-right: 8px;" > </component> <span>{{item.text}}</span> </template> <!--递归子菜单--> <my-sub-menu2 :subMenu="item.children"/> </el-sub-menu> </template> <!--树叶--> <el-menu-item v-else :index="item.menuId" > <template #title> <component :is="" style="width: 1.5em; height: 1.5em; margin-right: 8px;" > </component> <span>{{item.text}}</span> </template> </el-menu-item> </template>
父组件
<el-menu ref="domMenu" class="el-menu-vertical-demo" default-active="1" @select="select" background-color="#6c747c" text-color="#fff" active-text-color="#ffd04b" > <!--递归调用,显示菜单--> <my-sub-menu :subMenu="myMenu"/> </el-menu>
这样就可以实现基于json渲染的n级分组菜单了。