TDesign:遍历路由数据来填充menu菜单组件的问题

一、使用TDesign的菜单组件的时候,对菜单的数据是遍历路由信息填充上去的,方便菜单栏扩充。

一开始我是直接遍历,没有注意到便签的区别以及value值的区别

导致没有子菜单的情况下,右侧依然出现箭头,而且所有菜单功能跟第一项的一致,点击其他项菜单,第一项菜单也被触发,这时我想到应该是value值控制功能,标签控制了右侧箭头

红色箭头表示没有子菜单,但是依然右侧有箭头

解决方法:

一、value值放进路由元信息中去,解决功能一致问题;

二、遍历路由信息,判断item.children是否存在,children存在填充到t-submenu标签,children不存在填充到t-menu-item便签。

嵌套的子路由依然去进行以上判断(代码如下)

import { createRouter, createWebHashHistory } from 'vue-router'
import Layout from '../layout'
import Animal from '../views/biology/animal'
import Botany from '../views/biology/botany'

// // 异步路由
export const asyncRoutes = [
  {
    path: '/biology',
    name: 'biology',
    component: Layout,
    redirect: '/biology/animal/bird',
    meta: { title: '动植物', icon: 'logo-github-filled', value:'3' },
    children: [
      {
        path: 'animal',
        name: 'animal',
        component: Animal,
        redirect: '/biology/animal/bird',
        meta: { title: '动物', alive: true, value: '3-1' },
        children: [
          {
            path: 'bird',
            name: 'bird',
            component: () => import(/* webpackChunkName: "bird" */ '../views/biology/animal/bird'),
            meta: { title: '鸟类', hidden: true, activeMenu: '/biology/animal/bird',value:'3-1-1' }
          },
          {
            path: 'elephant',
            name: 'dlephant',
            component: () => import(/* webpackChunkName: "elephant" */ '../views/biology/animal/elephant'),
            meta: { title: '大象群', hidden: true, activeMenu: '/biology/animal/bird',value:'3-1-2' }
          },
          {
            path: 'monkey',
            name: 'monkey',
            component: () => import(/* webpackChunkName: "monkey" */ '../views/biology/animal/monkey'),
            meta: { title: '猴类', hidden: true, activeMenu: '/biology/animal/bird',value:'3-1-3' }
          }
        ]
      },
      {
        path: 'botany',
        name: 'botany',
        component: Botany,
        meta: { title: '植物', alive: true, value:'3-5'},
        children: [
          {
            path: 'flower',
            name: 'flower',
            component: () => import(/* webpackChunkName: "flower" */ '../views/biology/botany/flower'),
            meta: { title: '鲜花', hidden: true, activeMenu: '/biology/animal/bird',value:'3-5-1' }
          },
          {
            path: 'tree',
            name: 'tree',
            component: () => import(/* webpackChunkName: "tree" */ '../views/biology/botany/tree'),
            meta: { title: '树木', hidden: true, activeMenu: '/biology/animal/bird',value:'3-5-2' }
          }
        ]
      },
      {
        path: 'dislike',
        name: 'dislike',
        component: () => import(/* webpackChunkName: "dislike" */ '../views/biology/dislike'),
        meta: { title: '不喜爱的', hidden: true, activeMenu: '/biology/animal/bird',value:'3-2' }
      },
      {
        path: 'like',
        name: 'like',
        component: () => import(/* webpackChunkName: "like" */ '../views/biology/like'),
        meta: { title: '喜爱的', hidden: true, activeMenu: '/biology/animal/bird',value:'3-3' }
      }
    ]
  },
  {
    path: '/personal',
    name: 'personal',
    component: Layout,
    redirect: '/personal',
    component: () => import(/* webpackChunkName: "personal" */ '../views/personal'),
    meta: { title: '个人中心', icon: 'user-circle', value: 'user-circle' }
  },
  {
    path: '/video-area',
    name: 'videoArea',
    component: Layout,
    redirect: '/video-area/part-one',
    meta: { title: '视频区', icon: 'play-circle', value:'4' },
    children: [
      {
        path: 'part-one',
        name: 'partOne',
        component: () => import(/* webpackChunkName: "part-one" */ '../views/video-area/part-one'),
        meta: { title: '视频一区',value: '4-1' }
      },
      {
        path: 'part-two',
        name: 'partTwo',
        component: () => import(/* webpackChunkName: "part-two" */ '../views/video-area/part-two'),
        meta: { title: '视频二区',value: '4-2' }
      },
      {
        path: 'part-three',
        name: 'partThree',
        component: () => import(/* webpackChunkName: "part-three" */ '../views/video-area/part-three'),
        meta: { title: '视频三区',value: '4-3' }
      }
    ]
  },
  {
    path: '/exescope',
    name: 'exescope',
    component: Layout,
    redirect: '/exescope',
    component: () => import(/* webpackChunkName: "exescope" */ '../views/exescope'),
    meta: { title: '资源编辑', icon: 'edit-1',value: 'edit1' }
  }
]

// 固定路由
const defaultRoutes = [
  {
    path: '/',
    name: 'personal',
    // component: () => import(/* webpackChunkName: "personal" */ '../views/personal'),
    redirect: '/biology/animal/bird'
  },
  {
    path: '/login',
    name: 'login',
    component: () => import(/* webpackChunkName: "login" */ '../views/login')
  },
  {
    path: '/register',
    name: 'register',
    component: () => import(/* webpackChunkName: "register" */ '../views/register')
  }
]

const allRoutes = [...asyncRoutes, ...defaultRoutes];

const router = createRouter({
  history: createWebHashHistory(),
  routes: allRoutes
})

export default router

 

<template>
  <div class="aside">
    <div class="box">
      <t-menu
        v-model:expanded="expanded"
        theme="light"
        default-value="3-2"
        expand-mutex
        height="550px"
        :collapsed="collapsed"
        class="box_tab"
      >
        <template  v-for="item in asyncRoutes" :key="item.name">
          <t-submenu :value="item.meta.value" v-if="item.children">
            <template #icon>
              <t-icon :name="item.meta.icon" />
            </template>
            <template #title>
              <span>{{item.meta.title}}</span>
            </template>
            <template v-for="x in item.children" :key="x.name">
              <t-submenu :value="x.meta.value" :title="x.meta.title" v-if="x.children">
                <template v-for="y in x.children" :key="y.name">
                  <t-menu-item :value="y.meta.value">
                  {{y.meta.title}} 
                  </t-menu-item>
                </template>
                <!-- <t-menu-item value="3-1-2"> 三级菜单内容 </t-menu-item>
                <t-menu-item value="3-1-3"> 三级菜单内容 </t-menu-item> -->
              </t-submenu>
              <t-menu-item :value="x.meta.value" v-if="!x.children"> {{x.meta.title}} </t-menu-item>
            </template>
            <!-- <t-submenu value="3-5" title="二级菜单">
              <t-menu-item value="3-5-1"> 三级菜单内容 </t-menu-item>
              <t-menu-item value="3-5-2"> 三级菜单内容 </t-menu-item>
              <t-menu-item value="3-5-3"> 三级菜单内容 </t-menu-item>
            </t-submenu>
            <t-menu-item value="3-2"> 二级菜单内容 </t-menu-item>
            <t-menu-item value="3-3"> 二级菜单内容 </t-menu-item>
            <t-menu-item value="3-4"> 二级菜单内容 </t-menu-item> -->
          </t-submenu>
          <t-menu-item :value="item.meta.value" v-if="!item.children" >
            <template #icon>
              <t-icon :name="item.meta.icon" />
            </template>
            {{item.meta.title}}
          </t-menu-item>
          <!-- <t-menu-item value="user-circle">
            <template #icon>
              <t-icon name="user-circle" />
            </template>
            个人中心
          </t-menu-item>
          <t-submenu value="4">
            <template #icon>
              <t-icon name="play-circle" />
            </template>
            <template #title>
              <span>视频区</span>
            </template>
            <t-menu-item value="4-1"> 二级菜单内容 </t-menu-item>
            <t-menu-item value="4-2"> 二级菜单内容 </t-menu-item>
            <t-menu-item value="4-3"> 二级菜单内容 </t-menu-item>
          </t-submenu>
          <t-menu-item value="edit1">
            <template #icon>
              <t-icon name="edit-1" />
            </template>
            资源编辑
          </t-menu-item>-->
        </template>
          <template #operations>
            <t-icon
              class="t-menu__operations-icon"
              name="view-list"
              @click="changeCollapsed"
            />
          </template> 
      </t-menu>
    </div>
  </div>
</template>

<script setup>
import { ref } from "vue";
import { asyncRoutes } from "../../router";
console.log('222222',asyncRoutes.length)

const collapsed = ref(false);

const changeCollapsed = () => {
  collapsed.value = !collapsed.value;
};
const expanded = ref(["2", "3"]);
</script>

<style lang="scss" scoped>
.aside {
  width: 100%;
  height: 100%;
  .box {
    height: 94%;
    background-color: transparent;
    &_tab {
      background-color: #d1eeee;
    }
  }
}
</style>

主要修改点及效果

 

成功去除了不存在子菜单情况下右侧有箭头问题及去除了点击功能重复性(即点击其他项,第一项菜单也有反应)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值