el-menu 递归组件封装

为了实现多级菜单的递归调用,这样的话就不限制于层级
实现效果如下图所示
在这里插入图片描述
1.父组件调用,提供一个menu 用来递归
2.子组件主要是依靠 el-submenu 和 el-menu-item ,真正能够使用index作为路由跳转的其实是el-menu-item

父组件调用 mymenu
使用的menu的层级格式如下

<template>
  <div id="app">
    <el-menu
      class="elMenu"
      background-color="#333"
      text-color="#B0B0B2"
      active-text-color="#fff"
      :unique-opened="true"
      router
      ref="elMenu"
    >
      <!-- 递归动态菜单 -->
      <mymenu :menu="menuArr"></mymenu>
    </el-menu>
  </div>
</template>
<script>
import mymenu from "./cpns/my-menu.vue";
export default {
  components: {
    mymenu,
  },
  data() {
    return {
      menuArr: [
        {
          // 注意!注意!
          // 有children的菜单项,path不会使用的,所以path为什么都无所谓;
          // 没children的,即children的length等于0的,才会使用path属性做路由跳转
          name: "前端三大框架",
          path: "前端三大框架",
          icon: "el-icon-star-off",
          children: [
            {
              name: "vue页面",
              path: "/vue",
              icon: "el-icon-star-off",
              children: [],
            },
            {
              name: "react页面",
              path: "/react",
              icon: "el-icon-star-off",
              children: [],
            },
            {
              name: "angular页面",
              path: "/angular",
              icon: "el-icon-star-off",
              children: [],
            },
          ],
        },
        {
          name: "后端两大框架",
          path: "后端两大框架",
          icon: "el-icon-star-off",
          children: [
            {
              name: "Spring Boot页面",
              path: "/springBoot",
              icon: "el-icon-star-off",
              children: [],
            },
            {
              name: "Spring页面",
              path: "Spring页面",
              icon: "el-icon-star-off",
              children: [
                {
                  name: "MySql页面",
                  path: "/mysql",
                  icon: "el-icon-star-off",
                  children: [],
                },
                {
                  name: "Redis页面",
                  path: "/redis",
                  icon: "el-icon-star-off",
                  children: [],
                },
              ],
            },
            {
              name: "Mybatis页面",
              path: "/mybatis",
              icon: "el-icon-star-off",
              children: [],
            },
          ],
        },
      ],
    };
  },
};
</script>

<style lang="scss"></style>

mymenu组件如下

注意: 在template标签上使用v-for,:key="index"不能写在template标签上,因为其标签不会被渲染,会引起循环错误
所以这里是写在下一级的标签上

<template>
  <div>
    <!--  -->
    <template v-for="(item, index) in menu">
      <el-submenu
        :key="index"
        :index="item.path"
        v-if="item.children.length > 0"
      >
        <!--  -->

        <template slot="title">
          <i :class="item.icon"></i>
          <span>{{ item.name }}</span>
        </template>

        <!-- 循环二级 -->
        <mymenu :menu="item.children"></mymenu>
      </el-submenu>

      <!-- 没有子菜单的 -->

      <el-menu-item :key="index" v-else :index="item.path">
        <i :class="item.icon"></i>
        <span slot="title">{{ item.name }}</span>
      </el-menu-item>
    </template>
  </div>
</template>

<script>
export default {
  name: "mymenu",
  props: {
    menu: {
      type: Array,
      default() {
        return [];
      },
    },
  },
};
</script>

<style></style>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值