[element-ui] elementUI-NavMenu 导航菜单动态渲染(递归) 支持横向导航

彩蛋:后台管理系统一站式平台模板

vue-next-admin,这是基于 vue3.x + CompositionAPI + typescript + vite + element plus + vue-router-next + next.vuex,适配手机、平板、pc 的后台开源免费模板库

1、效果图

普通不支持横向布局请看这篇文章
在这里插入图片描述

2、代码

数据模拟格式与这里面的相同点击跳转查看数据格式

2.1 主组件

<template>
  <el-menu mode="horizontal" :default-active="$route.path" active-text-color="#09f">
    <template v-for="(val, key) in menuList">
      <el-submenu
        :index="val[props.index]"
        v-if="val[props.children] && val[props.children].length > 0"
        :key="key"
      >
        <template slot="title">
          <i :class="val.icon"></i>
          <span>{{ val[props.label] }}</span>
        </template>
        <SubItem :chil="val[props.children]" :props="props" @getSubItem="onMenuItemClick" />
      </el-submenu>
      <el-menu-item :index="val[props.index]" v-else @click="onMenuItemClick(val)" :key="key">
        <i :class="val.icon"></i>
        <span slot="title">{{ val[props.label] }}</span>
      </el-menu-item>
    </template>
  </el-menu>
</template>

<script>
import SubItem from "./subItem";
export default {
  name: "subMenu",
  components: { SubItem },
  props: {
    menuList: {
      type: Array,
      default() {
        return [];
      },
    },
    props: {
      type: Object,
      default() {
        return {
          children: "children",
          label: "label",
          index: "id",
        };
      },
    },
  },
  methods: {
    onMenuItemClick(item) {
      this.$emit("getmenu", item);
    },
  },
};
</script>

2.2 SubItem 组件 注意:此组件为了实现 NavMenu 导航菜单横向布局,
实现垂直布局的话,普通不支持横向布局请看这篇文章。当前也可以使用当前组件直接改mode="vertical"

<template>
  <div>
    <template v-for="(val, key) in chil">
      <el-submenu
        :index="val[props.index]"
        :key="key"
        v-if="val[props.children] && val[props.children].length > 0"
      >
        <template slot="title">{{ val[props.label] }}</template>
        <sub-item :chil="val[props.children]" :props="props" @getSubItem="onSubTtemClick" />
      </el-submenu>
      <el-menu-item
        :index="val[props.index]"
        v-else
        :key="key"
        @click="onSubTtemClick(val)"
      >{{ val[props.label] }}</el-menu-item>
    </template>
  </div>
</template>

<script>
export default {
  name: "subItem",
  props: {
    chil: {
      type: Array,
      default() {
        return [];
      },
    },
    props: {
      type: Object,
      default() {
        return {
          children: "children",
          label: "label",
          index: "id",
        };
      },
    },
  },
  methods: {
    onSubTtemClick(item) {
      this.$emit("getSubItem", item);
    },
  },
};
</script>

3、页面调用

// 横向导航 icon 高亮
.el-menu--horizontal .is-active .el-submenu__title i {
  color: #09f;
}
<template>
  <SubMenu :menu-list="menuList" :props="defaultProps" @getmenu="onGetMenu" />
</template>

<script>
import { menuList } from "@/mock/menuList";
import SubMenu from "@/components/subMenu";
export default {
  name: "elegant",
  components: { SubMenu },
  data() {
    return {
      defaultProps: {
        children: "children",
        label: "title",
        index: "path",
      },
      menuList,
    };
  },
  methods: {
    onGetMenu(item) {
      this.$router.push({
        path: item.path,
        query: { t: new Date().getTime() },
      });
    },
  },
};
</script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值