You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
<script setup lang="ts"> import Logo from "./logo.vue"; import { emitter } from "/@/utils/mitt"; import { useNav } from "../../hooks/nav"; import SidebarItem from "./sidebarItem.vue"; import { storageLocal } from "/@/utils/storage"; import { useRoute, useRouter } from "vue-router"; import { ref, computed, watch, onBeforeMount } from "vue"; import { findRouteByPath, getParentPaths } from "/@/router/utils"; import { usePermissionStoreHook } from "/@/store/modules/permission";
const route = useRoute(); const routers = useRouter().options.routes; const showLogo = ref( storageLocal.getItem("responsive-configure")?.showLogo ?? true );
const { pureApp, isCollapse, menuSelect } = useNav();
let subMenuData = ref([]);
const menuData = computed(() => { return pureApp.layout === "mix" ? subMenuData.value : usePermissionStoreHook().wholeMenus; });
function getSubMenuData(path) { // path的上级路由组成的数组
const parentPathArr = getParentPaths( path, usePermissionStoreHook().wholeMenus ); // 当前路由的父级路由信息
const parenetRoute = findRouteByPath( parentPathArr[0] || path, usePermissionStoreHook().wholeMenus ); if (!parenetRoute?.children) return; subMenuData.value = parenetRoute?.children; } getSubMenuData(route.path);
onBeforeMount(() => { emitter.on("logoChange", key => { showLogo.value = key; }); });
watch( () => route.path, () => { getSubMenuData(route.path); } ); </script>
<template> <div :class="['sidebar-container', showLogo ? 'has-logo' : '']"> <Logo v-if="showLogo" :collapse="isCollapse" /> <el-scrollbar wrap-class="scrollbar-wrapper"> <el-menu :default-active="route.path" :collapse="isCollapse" unique-opened router :collapse-transition="false" mode="vertical" class="outer-most" @select="indexPath => menuSelect(indexPath, routers)" > <sidebar-item v-for="routes in menuData" :key="routes.path" :item="routes" class="outer-most" :base-path="routes.path" /> </el-menu> </el-scrollbar> </div> </template>
|