vue动态渲染三级菜单

一:描述

在这里插入图片描述
将菜单渲染为上图样式
已确定路由中包含三级菜单,点击二级菜单时,在下方一tab选项卡方式展示所有三级菜单

代码

1.路由配置

{
    path: '/build',
    name: 'build',
    meta: {
      icon: 'office-building',
      title: '一级菜单',
      leaf: false,
      hidden: false,
    },
    component: loginpage,
    redirect: '/build/screen',
    children: [{
        path: 'screen',
        name: 'screen',
        meta: {
          title: '二级菜单',
          threeMenu: false,
          hidden: false,
        },
        component: () => import('../views/screen/Screen.vue'),
      },
      {
        path: 'onlinem',
        name: 'garden',
        meta: {
          title: '二级菜单',
          threeMenu: true,
          hidden: false,
        },
        component: Middle,
        redirect: '/build/onlinem/review',
        children: [{
            path: 'review',
            name: 'review',
            meta: {
              title: '三级菜单',
              hidden: false,
            },
            component: () => import('../views/review/Review.vue'),
          },
          {
            path: 'team',
            name: 'team',
            meta: {
              title: '三级菜单',
              hidden: false,
            },
            component: () => import('../views/team/Team.vue'),
          },
          {
            path: 'fruit',
            name: 'fruit',
            meta: {
              title: '三级菜单',
			  hidden: false,
            },
            component: () => import('../views/fruit/Fruit.vue'),
          },
        ],
      },

    ],
  },
  {
    path: '/intel',
    name: 'intel',
    meta: {
      icon: 'receiving',
      title: '一级菜单',
      leaf: false,
      hidden: false,
    },
    component: loginpage,
    redirect: '/intel/program',
    children: [
      {
        path: 'program',
        name: 'program',
        meta: {
          title: '二级菜单',
        },
        component: () => import('../views/planpage/planpage.vue'),
      },
      {
        path: 'develop',
        name: 'develop',
        meta: {
          title: '二级菜单',
        },
        component: () => import('../views/buildpage/buildpage.vue'),
      },
    ],
  },
路由配置说明

1.leaf 表示一级菜单下是否有子菜单。 true:只有一级菜单,没有自己菜单;false:有自己菜单(有二级菜单、三级菜单都是false)
2.hidden:该路由配置的信息是都要在导航栏中隐藏起来。true:在导航栏上隐藏起来;false:不隐藏
3.threeMenu:是否有三级菜单;true该二级菜单有三级菜单;false该二级菜单没有三级菜单
4.有三级菜单时, 二级菜单添加redirect进行重定向。

封装导航栏

导航栏直接使用elemen中的代码
sidebar.vue

<template>
  <div class="sidebar">
    <el-menu class="el-menu-demo" mode="horizontal" text-color="#444" active-text-color="##fff " :show-timeout="200"
      router @select="handleSelect">
      <sidebar-item v-for="(item,itemid) in permission_routes" :key="itemid" :item="item"></sidebar-item>
    </el-menu>
    //三级菜单展示
    <div class="smenu" v-if="srs">
      <div class="sbox">
        <router-link v-for="three in snhm" :key="three.name" :to="three.path">
          {{three.meta.title}}
        </router-link>
      </div>
    </div>
  </div>
</template>
computed: {
      ...mapGetters([
        'permission_routes',
      ]),//动态路由
    },
watch: {
      "$route": {
        handler(val, oldval) {
          this.getChildRoute(val)
        },
        deep: true,
        immediate: true
      },
    },
methods: {
      // 二级菜单被选
      handleSelect(key, keyPath) {
        if (this.$store.state.user.token) {
          // this.pagestate = false
          this.$emit('pagestate', false)
        }
      },
      // 三级菜单
      getChildRoute(currRoute) {
        console.log('三级菜单')
        if (currRoute.matched.length == 3) {
          this.permission_routes.map(item => {
            if (currRoute.matched[0].path == item.path) {
              // 二级路由,所有三级路由的数据
              item.children.map(child => {
                if (currRoute.matched[1].name == child.name) {
                  this.snhm = JSON.parse(JSON.stringify(child.children))
                }
              })
            }
          })
          this.srs = true;//有三级菜单则展示
        } else {
          this.snhm = [currRoute];
          this.srs = false;//没有三级菜单则不展示
        }
      }
    },

在渲染导航栏过程中,需要判断菜单的hidden属性;由于v-if优先级高于v-for,将菜单内容进行组件封装
sidebaritem.vue

<template>
  <div v-if="!item.meta.hidden">
    <template v-if="item.meta.leaf">
      <el-menu-item :index="item.redirect">
        <span slot="title">{{item.meta.title}}</span>
      </el-menu-item>
    </template>
    <el-submenu v-else :index="item.redirect">
      <template slot='title'>
        <span>{{item.meta.title}}</span>
      </template>
      <!-- 二级菜单 -->
      <el-menu-item v-for="(child,childId) in item.children" :index="item.path +'/'+ child.path" :key="childId"
        v-if="!child.meta.hidden">
        {{child.meta.title}}
      </el-menu-item>
    </el-submenu>
  </div>
</template>
props: {
      item: {
        type: Object,
        required: true,
      },
    },

以上根据转载修改为自己可用
转载地址:
(该文章为左侧两级导航栏及面包屑方式展示三级菜单)
https://blog.csdn.net/Start2019/article/details/119851382

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue三级联动下拉菜单是指一个三级级联的下拉菜单实现,其中每个层级的选项列表将随着前面选择的选项而动态更新。 实现Vue三级联动下拉菜单的步骤如下: 1. 定义绑定数据:首先需要定义三个数据对象,即第一级选项列表、第二级选项列表和第三级选项列表,以及他们的初始值。这些数据对象将通过Vue的数据绑定机制与前端界面绑定。 2. 实现选项列表的动态更新:当用户选择一级选项时,需要根据该选项对应的规则获取二级选项列表。同样的,当用户选择二级选项时,需要根据该选项对应的规则获取三级选项列表。这一步需要结合Vue的computed属性和watch机制实现。 3. 绑定前端交互事件:通过v-on指令将用户选择事件与Vue的方法绑定。当用户选择一级选项时将触发与该数据对象绑定的方法,在该方法中更新二级选项列表并清空三级选项列表。当用户选择二级选项时,将触发与该数据对象绑定的方法,在该方法中更新三级选项列表。 4. 前端界面的渲染:根据Vue的数据绑定机制,当数据对象改变时,前端界面上的内容也要相应地改变。因此,需要使用v-for指令结合绑定的数据对象遍历选项列表,并使用v-model指令将用户选择的选项与对应数据对象绑定。 总之,Vue三级联动下拉菜单是一种方便实用的前端交互方式,能够让用户在选择选项时更加快速和准确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值