vue + el-menu 实现菜单栏无限多层级分类

思路:数据格式须为数组内部多层嵌套模式,利用递归渲染菜单栏数据实现菜单多层级分类。

1.模拟菜单数据,引入封装组件

<template>
  <div class="container">
    <el-container>
      <el-header>Header</el-header>
      <el-container class="container-body">
        <el-aside class="menu-container">
 
          <!-- 实现菜单多级分类 -->
          <el-menu
            default-active="1-1-1-1"
            background-color="#545c64"
            text-color="#fff"
            active-text-color="#ffd04b">
            <!-- 引入组件 -->
            <menu-tree :menuData="menuList"></menu-tree>
          </el-menu>
 
        </el-aside>
        <el-main class="main-container">Main</el-main>
      </el-container>
    </el-container>
  </div>
</template>
 
<script>
import MenuTree from '../../components/MentTree'
export default {
  components: {
    MenuTree
  },
  data () {
    return {
      menuList: [
        {
          index: '1',
          icon: 'el-icon-menu',
          name: '一级菜单01',
          children: [
            {
              index: '1-1',
              icon: 'el-icon-film',
              name: '二级菜单01',
              children: [
                {
                  index: '1-1-1',
                  icon: 'el-icon-date',
                  name: '三级菜单01',
                  children: [
                    {
                      index: '1-1-1-1',
                      icon: 'el-icon-monitor',
                      name: '四级菜单01'
                    }
                  ]
                },
                {
                  index: '1-1-2',
                  icon: 'el-icon-headset',
                  name: '三级菜单02'
                }
              ]
            },
            {
              index: '1-2',
              icon: 'el-icon-data-line',
              name: '二级菜单02'
            }
          ]
        },
        {
          index: '2',
          icon: 'el-icon-s-data',
          name: '一级菜单02'
        },
        {
          index: '3',
          icon: 'el-icon-s-operation',
          name: '一级菜单03'
        },
        {
          index: '4',
          icon: 'el-icon-user',
          name: '一级菜单04'
        }
      ]
    }
  },
  mounted () {},
  methods: {}
}
</script>

2.MenuTree组件内部实现菜单栏递归渲染

<template>
  <div>
    <template v-for="menu in this.menuData">
      <el-submenu :key="menu.index" :index="menu.index" v-if="menu.children">
          <template slot="title">
              <i :class="menu.icon"></i>
              <span slot="title">{{menu.name}}</span>
          </template>
          <menu-tree :menuData="menu.children"></menu-tree>
      </el-submenu>
      <el-menu-item :key="menu.index" :index="menu.index" v-else>
          <i :class="menu.icon"></i>
          <span slot="title">{{menu.name}}</span>
      </el-menu-item>
    </template>
  </div>
</template>
 
<script>
export default {
  props: ['menuData'],
  name: 'MenuTree'
}
</script>

3.完成效果展示

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你使用 `vue-router` 将 `el-menu` 和路由关联起来,而你想要实现菜单中跳转到外部链接的功能,可以通过以下步骤实现: 1. 首先,在菜单项中设置一个自定义属性,用于存储外部链接。例如: ```html <el-menu-item index="1" :href="externalLink"> <i class="el-icon-menu"></i> <span>外部链接</span> </el-menu-item> ``` 在这个例子中,`externalLink` 是一个存储外部链接地址的变量。 2. 接着,在路由的 `beforeEach` 钩子函数中检查当前要跳转的路由是否是外部链接,如果是,则使用 `window.open()` 方法打开链接,并阻止路由跳转。例如: ```javascript router.beforeEach((to, from, next) => { const externalLink = to.meta.externalLink; if (externalLink) { window.open(externalLink, '_blank'); next(false); } else { next(); } }); ``` 在这个例子中,我们在路由的元信息中添加了一个 `externalLink` 属性,用于标识该路由是否是外部链接。如果是,则使用 `window.open()` 方法打开链接,并阻止路由跳转。 3. 最后,在菜单项的 `href` 属性中设置一个占位符,例如: ```html <el-menu-item index="1" :href="'external-link'"> <i class="el-icon-menu"></i> <span>外部链接</span> </el-menu-item> ``` 在这个例子中,我们将 `href` 属性设置为一个占位符 `'external-link'`,用于在路由中标识该菜单项是一个外部链接。在路由跳转时,我们可以根据该占位符来判断是否需要打开外部链接。 通过以上三个步骤,就可以实现在 `el-menu` 中跳转到外部链接的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值