美文网首页Vue.jsVue技术需要近期研究的项目
基于el-menu,用递归实现动态n级菜单

基于el-menu,用递归实现动态n级菜单

作者: 自然框架 | 来源:发表于2022-01-13 14:56 被阅读0次

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级分组菜单了。

相关文章

网友评论

    本文标题:基于el-menu,用递归实现动态n级菜单

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