Vue3实现动态切换Menu的示例代码

 更新时间:2024年11月08日 10:23:38   作者:Bjnsfxs  
本文介绍了在Vue3项目中使用顶部导航栏和侧边栏,通过顶部导航控制侧边栏的生成,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

项目中需要使用一个顶部导航栏和侧边栏,顶部导航栏来控制侧边栏的生成,于是需要动态切换

我是直接根据路由文件来控制整个菜单的生成结构,首先定义一下顶部导航栏的信息,他的key需要与路由的顶级name匹配,方便切换

// APP.vue

// 顶部导航栏信息
const navBarMenuList = [
  {
    name: 'Home',
    title: '应用分析'
  },

  {
    name: 'AppManage',
    title: '应用管理'
  }
]

路由文件中,给每个需要选中的菜单项添加上activeMenu,使用path作为值,同时这里我的需求中需要事件管理不展示子菜单,所以额外配置了一个showchild

export default [
  {
    path: '/appManage',	// 顶级路由(请让我这样简称)
    redirect: '/appManage/gameBaseInfo',
    name: 'AppManage',	// 这里与navBarMenu的name对应
    children: [
      {
        path: 'gameBaseInfo',	// 次级路由
        name: 'GameBaseInfo',
        icon: 'Memo',
        cnName: '基本信息',
        component: () => import('@/views/AppManage/BaseInfoView.vue'),
        meta: {
          activeMenu: 'gameBaseInfo',	// 用于给菜单的index项赋值,同时对应这个路由的地址
          needKeepAlive: true
        }
      },
      {
        path: 'eventManage',
        name: 'EventManage',
        icon: 'Management',
        cnName: '事件管理',
        showChild: false,	// 是否需要展示子菜单
        component: () => import('@/views/AppManage/EventManageView.vue'),
        redirect: '/appManage/eventManage/eventTable',
        meta: {
          needKeepAlive: true,
          activeMenu: 'eventManage'
        },
        children: [
          {
            path: 'eventDetail/:eventID?', // 子路由
            name: 'EventDetail',
            component: () => import('@/views/AppManage/EventDetailsView.vue')
          },
          {
            path: 'eventTable',
            name: 'EventTable',
            component: () => import('@/views/AppManage/EventMangeTable.vue')
          }
        ]
      }
    ]
  }
]

菜单的跳转不使用el-menu自带的router模式,自己使用route-link来实现跳转,跳转的路由则直接是由:顶级路由 + 次级路由+子路由形成。default-active一定要开启,以此来作为我们切换的根据,然后根据路由文件中有无children来判断是否生成子菜单。每个菜单项的index则对应路由文件中的activemenu,当路由切换后,defaultactive会自动计算出当前应该选中哪个菜单项。判断条件中的item.showchild是因为我有些菜单需要不展示子菜单。

<script lang='ts' setup>
// 顶部导航栏的选中情况
const navBarSelect = ref<string>('Home') 

// 路由信息,同时也是侧边栏生成的依据信息
const menuList = reactive<Array<any>>([])

// 顶部导航栏信息
const navBarMenuList = [
  {
    name: 'Home',
    title: '应用分析'
  },

  {
    name: 'AppManage',
    title: '应用管理'
  }
]

// 侧边栏跳转路由的基本路由
const basePath = ref<string | undefined>()

/**
 * @description: 创建侧边栏menu
 * @return {*}
 */
const createdMenuList = () => {
  let routes = router.options.routes // 获取路由信息
  let activeMenu = routes.find((item) => {
    return item.name === navBarSelect.value // 根据顶部导航栏的选中情况来选择选中哪个具体的路由信息,可以打印自己看一下
  })
  basePath.value = activeMenu?.path // 找到需要激活的菜单的路由,后续用来拼接需要跳转的路由
  menuList.splice(0, menuList.length, ...(activeMenu?.children as Array<any>)) // 清空原来的路由信息,并且加入新选中的
}
    
// 默认选中,他根据路由文件中的meta的activeMenu来判断当前选中的那个菜单
const defaultActive = computed(() => {
  return route.meta.activeMenu
})

</script>
   <!-- 顶部导航栏 -->
        <div class="navBarMenu">
          <el-menu
            :default-active="navBarSelect"
            class="el-menu-demo"
            mode="horizontal"
            @select="changeNavBar"
          >
            <el-menu-item
              v-for="item in navBarMenuList"
              class="navBarMenuItem"
              :index="item.name"
              >{{ item.title }}</el-menu-item
            >
          </el-menu>
        </div>
      <!-- 侧边栏 -->
<el-menu
          :default-active="defaultActive"
          class="sideBar"
          :collapse="isCollapse"
          ref="siderBar"
        >
          <template v-for="(item, index) in menuList">
            <el-sub-menu :index="`${index}`" v-if="item.children && item.showChild">
              <template #title>
                <el-icon><component :is="item.icon"></component></el-icon>
                <span>{{ item.cnName }}</span>
              </template>
              <router-link
                style="text-decoration: none"
                v-for="val in item.children"
                :to="{ path: basePath + '/' + item.path + '/' + val.path }"
                :key="index"
              >
                <el-menu-item :index="val.path">{{ val.cnName }}</el-menu-item>
              </router-link>
            </el-sub-menu>

            <router-link
              style="text-decoration: none"
              v-else
              :to="{ path: basePath + '/' + item.path }"
              :key="index"
            >
              <el-menu-item :index="item.path">
                <template #title>
                  <el-icon><component :is="item.icon" /></el-icon>
                  <span class="menuTitle">{{ item.cnName }}</span>
                </template>
              </el-menu-item>
            </router-link>
          </template>
          <div class="sideBarFold" @click="changeCollapse">
            <el-icon :size="25"><Fold /></el-icon>
          </div>
        </el-menu>

如果还有不清楚地地方可以打印一下routes,看一下就明白了。

到此这篇关于Vue3实现动态切换Menu的示例代码的文章就介绍到这了,更多相关Vue3 动态切换Menu内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用vue + element实现表格分页和前端搜索的方法

    利用vue + element实现表格分页和前端搜索的方法

    众所周知Element 是一套 Vue.js 后台组件库,它能够帮助你更轻松更快速地开发后台项目。下面这篇文章主要给大家介绍了关于利用vue + element实现表格分页和前端搜索的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • axios请求中断的几种方法

    axios请求中断的几种方法

    在实际应用场景中,假如有一个下载或者导出请求,数据量非常大的情况下,接口响应的会很慢,这时候我我们想中断请求,该怎么做呢?本文给大家介绍了axios请求中断的几种方法,需要的朋友可以参考下
    2024-10-10
  • Vue+Openlayer实现图形的拖动和旋转变形效果

    Vue+Openlayer实现图形的拖动和旋转变形效果

    Openlayer具有自己的扩展插件ol-ext,可以用来实现图形的拖拽、旋转、缩放、拉伸、移动等操作,本文将主要介绍通过Openlayer实现图形的拖动和旋转,需要的同学可以学习一下
    2021-11-11
  • 基于vue 实现token验证的实例代码

    基于vue 实现token验证的实例代码

    这篇文章主要介绍了基于vue 实现token验证的实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • 如何利用vue实现波谱拟合详解

    如何利用vue实现波谱拟合详解

    这篇文章主要给大家介绍了关于如何利用vue实现波谱拟合的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • vue3中的watch和watchEffect实例详解

    vue3中的watch和watchEffect实例详解

    watch和watchEffect都是监听器,但在写法和使用上有所区别,下面这篇文章主要给大家介绍了关于vue3中watch和watchEffect的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • 用Vue.js在浏览器中实现裁剪图像功能

    用Vue.js在浏览器中实现裁剪图像功能

    在本教程中,我们将探讨如何在浏览器中使用 JavaScript 库来操作图片,为服务器上的存储做准备,并在 Web 程序中使用。我们将使用 Vue.js 而不是原生 JavaScript来完成此操作,需要的朋友可以参考下
    2019-06-06
  • vue实现登录时滑块验证

    vue实现登录时滑块验证

    这篇文章主要为大家详细介绍了vue实现登录时滑块验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Vue-resource安装过程及使用方法解析

    Vue-resource安装过程及使用方法解析

    这篇文章主要介绍了Vue-resource安装过程及使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • vue实现下拉框二级联动效果的实例代码

    vue实现下拉框二级联动效果的实例代码

    这篇文章主要介绍了vue实现下拉框二级联动效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11

最新评论