项目中需要使用一个顶部导航栏和侧边栏,顶部导航栏来控制侧边栏的生成,于是需要动态切换
我是直接根据路由文件来控制整个菜单的生成结构,首先定义一下顶部导航栏的信息,他的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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论