From 1c280581414cb56c1d32978c4e8b9d1a8afa5745 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期三, 18 十二月 2024 13:22:47 +0800 Subject: [PATCH] update 优化 TopNav内链菜单点击没有高亮 --- src/components/TopNav/index.vue | 111 ++++++++++++++++++++++++++++++++----------------------- 1 files changed, 64 insertions(+), 47 deletions(-) diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue index 2092415..cfe2cd7 100644 --- a/src/components/TopNav/index.vue +++ b/src/components/TopNav/index.vue @@ -1,17 +1,18 @@ <template> - <el-menu :default-active="activeMenu" mode="horizontal" @select="handleSelect" :ellipsis="false"> + <el-menu :default-active="activeMenu" mode="horizontal" :ellipsis="false" @select="handleSelect"> <template v-for="(item, index) in topMenus"> - <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber" - ><svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item + <el-menu-item v-if="index < visibleNumber" :key="index" :style="{ '--theme': theme }" :index="item.path" + ><svg-icon v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" :icon-class="item.meta ? item.meta.icon : ''" /> + {{ item.meta?.title }}</el-menu-item > </template> <!-- 椤堕儴鑿滃崟瓒呭嚭鏁伴噺鎶樺彔 --> - <el-sub-menu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber"> + <el-sub-menu v-if="topMenus.length > visibleNumber" :style="{ '--theme': theme }" index="more"> <template #title>鏇村鑿滃崟</template> <template v-for="(item, index) in topMenus"> - <el-menu-item :index="item.path" :key="index" v-if="index >= visibleNumber" - ><svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item + <el-menu-item v-if="index >= visibleNumber" :key="index" :index="item.path" + ><svg-icon :icon-class="item.meta ? item.meta.icon : ''" /> {{ item.meta?.title }}</el-menu-item > </template> </el-sub-menu> @@ -24,7 +25,7 @@ import useAppStore from '@/store/modules/app'; import useSettingsStore from '@/store/modules/settings'; import usePermissionStore from '@/store/modules/permission'; -import { RouteOption } from 'vue-router'; +import { RouteRecordRaw } from 'vue-router'; // 椤堕儴鏍忓垵濮嬫暟 const visibleNumber = ref<number>(-1); @@ -33,86 +34,89 @@ // 闅愯棌渚ц竟鏍忚矾鐢� const hideList = ['/index', '/user/profile']; -const appStore = useAppStore() -const settingsStore = useSettingsStore() -const permissionStore = usePermissionStore() +const appStore = useAppStore(); +const settingsStore = useSettingsStore(); +const permissionStore = usePermissionStore(); const route = useRoute(); const router = useRouter(); // 涓婚棰滆壊 const theme = computed(() => settingsStore.theme); // 鎵�鏈夌殑璺敱淇℃伅 -const routers = computed(() => permissionStore.topbarRouters); +const routers = computed(() => permissionStore.getTopbarRoutes()); // 椤堕儴鏄剧ず鑿滃崟 const topMenus = computed(() => { - let topMenus:RouteOption[] = []; + let topMenus: RouteRecordRaw[] = []; routers.value.map((menu) => { if (menu.hidden !== true) { // 鍏煎椤堕儴鏍忎竴绾ц彍鍗曞唴閮ㄨ烦杞� - if (menu.path === "/") { - topMenus.push(menu.children? menu.children[0] : menu); + if (menu.path === '/') { + topMenus.push(menu.children ? menu.children[0] : menu); } else { - topMenus.push(menu); + topMenus.push(menu); } } - }) + }); return topMenus; -}) +}); // 璁剧疆瀛愯矾鐢� const childrenMenus = computed(() => { - let childrenMenus:RouteOption[] = []; + let childrenMenus: RouteRecordRaw[] = []; routers.value.map((router) => { router.children?.forEach((item) => { if (item.parentPath === undefined) { - if(router.path === "/") { - item.path = "/" + item.path; + if (router.path === '/') { + item.path = '/' + item.path; } else { - if(!isHttp(item.path)) { - item.path = router.path + "/" + item.path; + if (!isHttp(item.path)) { + item.path = router.path + '/' + item.path; } } item.parentPath = router.path; } childrenMenus.push(item); - }) - }) + }); + }); return constantRoutes.concat(childrenMenus); -}) +}); // 榛樿婵�娲荤殑鑿滃崟 const activeMenu = computed(() => { - const path = route.path; + let path = route.path; + if (path === '/index') { + path = '/system/user'; + } let activePath = path; - if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) { + if (path !== undefined && path.lastIndexOf('/') > 0 && hideList.indexOf(path) === -1) { const tmpPath = path.substring(1, path.length); - activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/")); if (!route.meta.link) { - appStore.toggleSideBarHide(false); + activePath = '/' + tmpPath.substring(0, tmpPath.indexOf('/')); + appStore.toggleSideBarHide(false); } - } else if(!route.children) { + } else if (!route.children) { activePath = path; appStore.toggleSideBarHide(true); } activeRoutes(activePath); return activePath; -}) +}); const setVisibleNumber = () => { const width = document.body.getBoundingClientRect().width / 3; visibleNumber.value = parseInt(String(width / 85)); -} +}; const handleSelect = (key: string) => { currentIndex.value = key; - const route = routers.value.find(item => item.path === key); + const route = routers.value.find((item) => item.path === key); if (isHttp(key)) { // http(s):// 璺緞鏂扮獥鍙f墦寮� - window.open(key, "_blank"); + window.open(key, '_blank'); } else if (!route || !route.children) { // 娌℃湁瀛愯矾鐢辫矾寰勫唴閮ㄦ墦寮� - const routeMenu = childrenMenus.value.find(item => item.path === key); + const routeMenu = childrenMenus.value.find((item) => item.path === key); if (routeMenu && routeMenu.query) { let query = JSON.parse(routeMenu.query); router.push({ path: key, query: query }); @@ -125,35 +129,35 @@ activeRoutes(key); appStore.toggleSideBarHide(false); } -} +}; const activeRoutes = (key: string) => { - let routes:RouteOption[] = []; + let routes: RouteRecordRaw[] = []; if (childrenMenus.value && childrenMenus.value.length > 0) { childrenMenus.value.map((item) => { - if (key == item.parentPath || (key == "index" && "" == item.path)) { + if (key == item.parentPath || (key == 'index' && '' == item.path)) { routes.push(item); } }); } - if(routes.length > 0) { + if (routes.length > 0) { permissionStore.setSidebarRouters(routes); } else { appStore.toggleSideBarHide(true); } return routes; -} +}; onMounted(() => { - window.addEventListener('resize', setVisibleNumber) -}) + window.addEventListener('resize', setVisibleNumber); +}); onBeforeUnmount(() => { - window.removeEventListener('resize', setVisibleNumber) -}) + window.removeEventListener('resize', setVisibleNumber); +}); onMounted(() => { - setVisibleNumber() -}) + setVisibleNumber(); +}); </script> <style lang="scss"> @@ -166,7 +170,8 @@ margin: 0 10px !important; } -.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-sub-menu.is-active .el-submenu__title { +.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, +.el-menu--horizontal > .el-sub-menu.is-active .el-submenu__title { border-bottom: 2px solid #{'var(--theme)'} !important; color: #303133; } @@ -180,4 +185,16 @@ padding: 0 5px !important; margin: 0 10px !important; } + +/* 鑳屾櫙鑹查殣钘� */ +.topmenu-container.el-menu--horizontal > .el-menu-item:not(.is-disabled):focus, +.topmenu-container.el-menu--horizontal > .el-menu-item:not(.is-disabled):hover, +.topmenu-container.el-menu--horizontal > .el-submenu .el-submenu__title:hover { + background-color: #ffffff !important; +} + +/* 鍥炬爣鍙抽棿璺� */ +.topmenu-container .svg-icon { + margin-right: 4px; +} </style> -- Gitblit v1.9.3