1. 创建一个TreeMenu组件
<template>
  <el-menu :default-active="defaultActive" :unique-opened="uniqueOpened" class="el-menu-vertical-demo" :collapse="collapse">
    <template v-for="item in menuData">
      <template v-if="item.children">
        <el-submenu :index="item.index">
          <template slot="title">{{ item.label }}</template>
          <tree-menu :menu-data="item.children" :default-active="defaultActive" :unique-opened="uniqueOpened" :collapse="collapse"></tree-menu>
        </el-submenu>
      </template>
      <template v-else>
        <el-menu-item :index="item.index">{{ item.label }}</el-menu-item>
      </template>
    </template>
  </el-menu>
</template>

<script>
export default {
  name: 'TreeMenu',
  props: {
    menuData: {
      type: Array,
      default: () => {
        return []
      }
    },
    defaultActive: {
      type: String,
      default: ''
    },
    uniqueOpened: {
      type: Boolean,
      default: true
    },
    collapse: {
      type: Boolean,
      default: false
    }
  }
}
</script>
  1. 在父组件中使用TreeMenu组件
<template>
  <tree-menu :menu-data="menuData"></tree-menu>
</template>

<script>
import TreeMenu from '@/components/TreeMenu'

export default {
  name: 'NavMenu',
  components: { TreeMenu },
  data() {
    return {
      menuData: [
        {
          index: '1',
          label: '一级菜单1',
          children: [
            {
              index: '1-1',
              label: '二级菜单1-1'
            },
            {
              index: '1-2',
              label: '二级菜单1-2'
            }
          ]
        },
        {
          index: '2',
          label: '一级菜单2',
          children: [
            {
              index: '2-1',
              label: '二级菜单2-1'
            },
            {
              index: '2-2',
              label: '二级菜单2-2'
            }
          ]
        }
      ]
    }
  }
}
</script>
  1. 使用父组件中的数据渲染TreeMenu
<template>
  <el-menu :default-active="defaultActive" :unique-opened="uniqueOpened" class="el-menu-vertical-demo" :collapse="collapse">
    <template v-for="item in menuData">
      <template v-if="item.children">
        <el-submenu :index="item.index">
          <template slot="title">{{ item.label }}</template>
          <tree-menu :menu-data="item.children" :default-active="defaultActive" :unique-opened="uniqueOpened" :collapse="collapse"></tree-menu>
        </el-submenu>
      </template>
      <template v-else>
        <el-menu-item :index="item.index">{{ item.label }}</el-menu-item>
      </template>
    </template>
  </el-menu>
</template>

<script>
export default {
  name: 'TreeMenu',
  props: {
    menuData: {
      type: Array,
      default: () => {
        return []
      }
    },
    defaultActive: {
      type: String,
      default: ''
    },
    uniqueOpened: {
      type: Boolean,
      default: true
    },
    collapse: {
      type: Boolean,
      default: false
    }
  }
}
</script>
用vue20封装一个树形导航栏要能实现el-menu的功能

原文地址: http://www.cveoy.top/t/topic/bv2h 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录