<template> <a-layout class="main-content"> <a-layout-sider :collapsed="collapsed" theme="light" :trigger="null" collapsible> <div v-if="!collapsed" class="title flex-center"> <div>超级后台</div> </div> <div v-else class="logo flex-center"> <img src="@/assets/vue.svg" title="超级后台" alt="xx" /> </div> <!-- --> <!-- <a-menu v-model:selectedKeys="selectedKeys" theme="light" mode="inline"> <a-menu-item key="1"> <router-link to="/index"> <pie-chart-outlined /> <span>首页</span> </router-link> </a-menu-item> <a-menu-item key="2"> <router-link to="/register/index"> <pie-chart-outlined /> <span>注册</span> </router-link> </a-menu-item> </a-menu> --> <!-- 动态生成菜单项 --> <a-menu v-model:selectedKeys="selectedKeys" theme="light" mode="inline"> <template v-for="route in menuRoutes"> <!-- --> <a-menu-item v-if="route.name === 'dashboard'"> <router-link :to="`${route.children[0].path}`"> <pie-chart-outlined /> <span>{{ route.meta?.title }}</span> </router-link> </a-menu-item> <a-sub-menu v-if="route.children && route.children.length && route?.name !== 'dashboard'" :key="route.path"> <template #title> <pie-chart-outlined /> <span>{{ route.meta?.title }}</span> </template> <a-menu-item v-for="child in route.children" :key="child.path"> <router-link :to="`${route.path}${child.path}`">{{ child.meta?.title }}</router-link> </a-menu-item> </a-sub-menu> <!-- --> <a-menu-item v-if="!route.children"> <router-link :to="route.path"> <pie-chart-outlined /> <span>{{ route.meta?.title }}</span> </router-link> </a-menu-item> </template> </a-menu> </a-layout-sider> <a-layout> <a-layout-header class="layout-header"> <layout-header v-model:collapsed="collapsed" /> </a-layout-header> <a-layout-content class="layout-content"> <router-view v-slot="{ Component, route }"> <transition appear name="fade-transform" mode="out-in"> <keep-alive :include="keepAliveNames"> <component :is="Component" :key="route.fullPath" /> </keep-alive> </transition> </router-view> </a-layout-content> </a-layout> </a-layout> </template> <script setup lang="ts"> import LayoutHeader from '@/components/layout/header/LayoutHeader.vue' import { computed } from 'vue' // import Sliber from '@/components/layout/sliber/sliber.vue' import { staticRouter } from '@/router/staticRouters' import { useRoute } from 'vue-router' const route = useRoute() // 当前选中的菜单项 // const selectedKeys = computed(() => route.path) const selectedKeys = computed(() => [route.path]) // 过滤出需要在菜单中显示的路由 const menuRoutes = computed(() => staticRouter.filter((route) => route.meta && route.meta.title)) // 示例:动态控制缓存页面的名称 // const keepAliveNames = ref(['index']) import { ref } from 'vue' // 控制菜单折叠 const collapsed = ref<boolean>(false) const keepAliveNames = ref<string[]>([]) </script> <style scoped lang="scss"> .main-content { width: 100vw; height: 100vh; .layout-header { background: #ffffff; padding: 0; } .layout-content { margin: 10px; padding: 4px; background: #f5f7fd; min-height: 280px; border-radius: 5px; overflow: auto; } } .title { height: 32px; width: 168px; transition: width 2ms linear 2ms; margin: 16px; color: black; font-weight: bold; font-size: 20px; } .logo { margin: 16px; img { width: 50px; height: 50px; } } .site-layout .site-layout-background { background: #ffffff; } </style>