vue项目多级菜单,如何渲染

1、当不确定菜单有多少层级的时候,第一时间就想到使用递归的方式渲染菜单,下面我们来看看如何实现。(使用技术:vue+iview)

菜单图例
2、使用ivew菜单组件,目前项目也用的是这个框架,不熟悉的小伙伴可以先看看这个菜单组件,熟悉的小伙伴我们继续向下看。

3、我的实现思路,判断没有子菜单单的时候,使用组件的正常渲染,如果有子菜单,那就需要加载这个组件 ,继续帮我们循环,走下一步

     <Menu
        ref="user"
        accordion
        width="auto"
      >
        <template v-for="(items,index) in leftNav">
          <!-- 有子菜单 -->
          <left-menu-nav
            v-if="items.children&&items.children.length!==0"
            :menuList="items"
            :key="items.name"
          ></left-menu-nav>
          <!-- 无子菜单 -->
          <menu-item
            v-else
            :key="index"
            :name="items.id"
          >
            <i class="iconfont" :class="items.icon"></i>
            {{items.name}}
          </menu-item>
        </template>
      </Menu>

4、接下来我们看看这个组件怎么写,主要实现思路跟上面的一样,有子菜单的时候,继续调这个组件,否则,就显示子菜单

<Submenu :name="menuList.id">
    <!-- 父级菜单 -->
    <template slot="title">
      <!-- <Icon :type="menuList.icon" /> -->
      <i class="iconfont" :class="menuList.icon"></i>
      <span>{{ menuList.name }}</span>
    </template>
    <template v-for="item in menuList.children">
      <!-- 如果还有子集,继续调用   -->
      <left-menu-nav
        v-if="item.children&&item.children.length!==0"
        :menuList="item"
        :key="item.index"
      ></left-menu-nav>
      <!-- 子菜单  -->
      <menu-item v-else :key="item.id" :name="item.id" >
        <!-- <Icon :type="item.icon"></Icon> -->
        <i class="iconfont" :class="item.icon"></i>
        {{item.name}}
      </menu-item>
    </template>
  </Submenu>

5、完整的代码如下
(1)、父组件view

  <Sider
      ref="side1"
      hide-trigger
      collapsible
      :collapsed-width="65"
      v-model="isCollapsed"
      :style="{position: 'fixed', height: '100vh', left: 0, overflow: 'auto'}"
    >
      <Menu
        ref="user"
        :class="menuitemClasses"
        :active-name="$store.state.activeName"
        :open-names="openKeymenu"
        accordion
        v-show="!isCollapsed"
        theme="dark"
        width="auto"
      >
        <template v-for="(items,index) in leftNav">
          <!-- 有子菜单 -->
          <left-menu-nav
            v-if="items.children&&items.children.length!==0"
            :menuList="items"
            :key="items.name"
          ></left-menu-nav>
          <!-- 无子菜单 -->
          <menu-item
            v-else
            :key="index"
            :name="items.id"
            @click.native="dropMenu(JSON.stringify(items))"
          >
            <i class="iconfont" :class="items.icon"></i>
            {{items.name}}
          </menu-item>
        </template>
      </Menu>
    </Sider>

(2)、父组件的js

import leftMenuNav from "@/components/slidemenu";
export default {
  name: "leftMenu",
  components: {
    leftMenuNav
  },
}

(3)slidemenu.vue文件代码

<template>
  <Submenu :name="menuList.id">
    <!-- 父级菜单 -->
    <template slot="title">
      <!-- <Icon :type="menuList.icon" /> -->
      <i class="iconfont" :class="menuList.icon"></i>
      <span>{{ menuList.name }}</span>
    </template>
    <template v-for="item in menuList.children">
      <!-- 如果还有子集,继续调用   -->
      <left-menu-nav
        v-if="item.children&&item.children.length!==0"
        :menuList="item"
        :key="item.index"
      ></left-menu-nav>
      <!-- 子菜单  -->
      <menu-item v-else :key="item.id" :name="item.id">
        <!-- <Icon :type="item.icon"></Icon> -->
        <i class="iconfont" :class="item.icon"></i>
        {{item.name}}
      </menu-item>
    </template>
  </Submenu>
</template>
<script>
export default {
  name: "leftMenuNav",
  props: {
    menuList: {
      type: Object,
      default: () => {}
    }
  },
  data() {
    return {};
  },
  methods: {
  
  },
  mounted() {
  }
};
</script>
<style  scoped>
</style>

6、只是自己的理解,如果 你有更好的意见或者建议,欢迎和大佬们一起交流学习。祝各位工作顺利,生活愉快。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值