vue element递归菜单组件

文章介绍了在Vue3结合ElementPlus的环境下,如何进行路由拆分以及构建动态菜单组件。通过使用等组件,配合v-for循环渲染菜单项,实现了根据路由信息动态生成多级菜单的功能。同时,利用import动态导入组件以优化代码结构。
摘要由CSDN通过智能技术生成

思路:路由拆分

将路由信息整合在一起

拆分菜单组件 

  <el-menu  class="el-menu-vertical-demo" router @select="sec"  :collapse="false">
 <menuItem v-for="items in menus" :item="items" :key="items.path"></menuItem>
</el-menu>

import menuItem from '../components/me.vue'

<!--  -->
<template>
<div id="side-bar-item">
    <el-submenu v-if="item.children&&item.children.length  > 0" :index="item.path" :key="item.path">
        <template slot="title">
            <i :class="item.icon"/>
            <span slot="title">{{item.meta.title}}</span>
        </template>
        <div v-if="item.children&& item.children.length  > 0">
            <meunItem v-for="(innerMenu,index) in item.children" :item="innerMenu" :key="index"/>
        </div>
    </el-submenu>
    <el-menu-item v-else :index="item.path" :key="item.path">
        <i :class="item.icon"/>
        <span slot="title">{{item.meta.title}}</span>
    </el-menu-item>
</div>
</template>

<script>
import meunItem from '../components/me.vue'
export default {
  props:['item'],
  components: {
    meunItem: () => import('../components/me.vue'),
  },
}

</script>
<style  scoped>
</style>

vue3+elementPlus

  <el-menu
    class="el-menu-vertical-demo"
    :collapse="false"
  >
   <meunItem v-for="items in menulistI" :item="items" :key="items.path"></meunItem>
  </el-menu>
import meunItem from '../components/me.vue'
import {  Location } from '@element-plus/icons-vue'

const menulistI=reactive( [
    {
      path: 'userManage',
      icon: Location,
      meta:{ title:'用户管理'},
      children: [
            {
              path: 'orderManages',
      icon: Location,
      meta:{ title:'用户管理'},
      children:[ {
              path: 'orderManages',
      icon: Location,
      meta:{ title:'用户管理'},

            }]
            }
        ]
    },
    {
      path: 'orderManage',
      icon: Location,
      meta:{ title:'用户管理'},

    },
])
<template>
<div>
    <el-sub-menu  v-if="item.children&&item.children.length  > 0" :index="item.path" :key="item.path">
        <template #title>
      <component :is="item.icon"></component>    
            <span>{{item.meta.title}}</span>
        </template>
        <div v-if="item.children&& item.children.length  > 0">
            <meunItem v-for="(innerMenu,index) in item.children" :item="innerMenu" :key="index"/>
        </div>
    </el-sub-menu>
    <el-menu-item v-else :index="item.path" :key="item">
        <component :is="item.icon"></component>  
      <template #title>{{item.meta.title}}</template>
    </el-menu-item>

</div>
</template>

<script setup lang='ts'>
import {
  Location,
} from '@element-plus/icons-vue'
import meunItem from '../components/me.vue'
 defineProps({
    item: {
        type: Object,
        default:[]
    }
}

</script>

<style  scoped>
svg{
    width: 25px;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值