使用 Vue 3+Element Plus+TypeScript 实现无限级动态菜单

子组件递归调用时, 无需引入, 根据name名称直接引用

// 父组件,如mainMenu.vue

  1. <template>
  2.  <el-menu>
  3.    <child-menu :dataList="listData"></child-menu>
  4.  </el-menu>
  5. </template>
  6. <script setup lang="ts">
  7. import childMenu from './childMenu.vue'

  8. const listData = [
  9.  {
  10.    name: '钠管设备',
  11.    id: '1',
  12.    level: 1,
  13.    child: [
  14.      {
  15.        name: '系统默认组',
  16.        id: '2',
  17.        flag: true
  18.      },
  19.      {
  20.        name: '设备一组',
  21.        id: '3',
  22.        child: [
  23.          {
  24.            name: '一组A小组',
  25.            id: '4',
  26.            child: [
  27.              {
  28.                name: '一组A小组的成员1',
  29.                id: '5'
  30.              },
  31.              {
  32.                name: '一组A小组的成员2',
  33.                id: '6',
  34.                child: [
  35.                  {
  36.                    name: '一组A小组的成员何总',
  37.                    id: '7'
  38.                  },
  39.                  {
  40.                    name: '一组A小组的成员曾',
  41.                    id: '8'
  42.                  },
  43.                  {
  44.                    name: '一组A小组的成员飘总',
  45.                    id: '9'
  46.                  }
  47.                ]
  48.              }
  49.            ]
  50.          },
  51.          {
  52.            name: '一组B小组',
  53.            id: '10'
  54.          }
  55.        ]
  56.      },
  57.      {
  58.        name: '设备二组',
  59.        id: '11'
  60.      }
  61.    ]
  62.  }
  63. ]
  64. </script>
cf

//childMenu.vue 子组件

  1. <template>
  2.  <div class="menu-tree">
  3.    <label v-for="list in dataList" :key="list.id">
  4.      <el-sub-menu :index="list.id" v-if="list.child">
  5.        <template #title>
  6.          <i class="el-icon-location" v-if="list.level"></i>
  7.          <span>{{ list.name }}</span>
  8.        </template>
  9.        <label>
  10.          <child-menu :dataList="list.child"></child-menu>
  11.        </label>
  12.      </el-sub-menu>
  13.      <el-menu-item v-else :index="list.name">
  14.        <span>{{ list.name }}</span>
  15.      </el-menu-item>
  16.    </label>
  17.  </div>
  18. </template>
  19. <script setup lang="ts">
  20. defineProps<{
  21.  dataList: Array<any>
  22. }>()
  23. </script>
cf

// 备注:需要提前引入elementplus组件。可直接使用之前生成的框架(前九步即可):链接地址