perf: sidebar结构调整

This commit is contained in:
rd
2025-09-01 14:07:18 +08:00
parent fd4f54ed56
commit 8fff4c1ef1
3 changed files with 61 additions and 49 deletions

View File

@ -96,7 +96,7 @@ export default defineComponent({
const renderMenuList = () => { const renderMenuList = () => {
return currentMenuList.value.map((item) => { return currentMenuList.value.map((item) => {
if (!item.children) { if (!item.children) {
return renderMenuItem(item, sidebarStore.menuCollapse); return renderMenuItem(item, collapsed.value);
} }
return ( return (
<Dropdown <Dropdown
@ -115,7 +115,7 @@ export default defineComponent({
}, },
}} }}
> >
{renderMenuItem(item, sidebarStore.menuCollapse)} {renderMenuItem(item, collapsed.value)}
</Dropdown> </Dropdown>
); );
}); });
@ -161,39 +161,39 @@ export default defineComponent({
trigger trigger
onCollapse={setCollapsed} onCollapse={setCollapsed}
> >
<Menu <Menu class={`siderBar-wrap w-full flex flex-col px-16px pt-16px ${collapsed.value ? 'menu-fold' : ''}`}>
class={`siderBar-wrap p-16px w-full h-full flex flex-col ${sidebarStore.menuCollapse ? 'menu-fold' : ''}`}
>
{showAiSearch.value && ( {showAiSearch.value && (
<> <>
<Menu.Item class={`menu-item !mb-0 ${isHomeRoute.value ? 'active' : ''}`} onClick={handleUserHome}> <Menu.Item class={`menu-item !mb-0 ${isHomeRoute.value ? 'active' : ''}`} onClick={handleUserHome}>
<img src={icon1} width={18} height={18} /> <img src={icon1} width={18} height={18} />
{!sidebarStore.menuCollapse && ( {!collapsed.value && <span class="cts label">开始工作</span>}
<span class="cts label">开始工作</span>
)}
</Menu.Item> </Menu.Item>
<div class="line w-full h-1px bg-#211F24 my-12px"></div> <div class="line w-full h-1px bg-#211F24 my-12px"></div>
</> </>
)} )}
<div class="flex flex-col flex-1"> <div class="flex flex-col flex-1">
<div class="menu-list flex-1">{renderMenuList()}</div> <div class="menu-list flex-1">{renderMenuList()}</div>
<div class="flex justify-center items-center"> </div>
</Menu>
<div <div
class="flex fold-btn items-center cursor-pointer" class={`bg-#F6F5FC flex items-center absolute bottom-0 w-full pt-8px px-16px pb-16px right-0 ${
collapsed.value ? 'justify-center' : 'justify-end'
}`}
>
<div
class="flex fold-btn items-center cursor-pointer h-22px "
onClick={() => { onClick={() => {
sidebarStore.setMenuCollapse(); sidebarStore.setMenuCollapse();
}} }}
> >
{sidebarStore.menuCollapse ? ( {collapsed.value ? (
<icon-menu-unfold size={16} class="color-#55585F icon mr-4px" /> <icon-menu-unfold size={16} class="color-#55585F icon mr-4px" />
) : ( ) : (
<icon-menu-fold size={16} class="color-#55585F icon mr-4px" /> <icon-menu-fold size={16} class="color-#55585F icon mr-4px" />
)} )}
{!sidebarStore.menuCollapse && <span class="cts !color-#55585F flex-shrink-0">收起</span>} {!collapsed.value && <span class="cts !color-#55585F flex-shrink-0">收起</span>}
</div> </div>
</div> </div>
</div>
</Menu>
</Layout.Sider> </Layout.Sider>
); );
}, },

View File

@ -44,6 +44,10 @@
background-color: transparent; background-color: transparent;
} }
} }
.ant-layout-sider {
.ant-layout-sider-children {
position: relative;
// padding: 16px 0;
.siderBar-wrap { .siderBar-wrap {
background: transparent !important; background: transparent !important;
border: none !important; border: none !important;
@ -62,6 +66,8 @@
.line { .line {
opacity: 0.06; opacity: 0.06;
} }
}
.fold-btn { .fold-btn {
&:hover { &:hover {
.cts, .cts,
@ -71,3 +77,6 @@
} }
} }
} }
}

View File

@ -15,6 +15,7 @@ interface sidebarState {
currentMenuList: any[]; currentMenuList: any[];
unreadInfo: number[]; unreadInfo: number[];
menuCollapse: boolean; menuCollapse: boolean;
hasMenuList: boolean;
} }
let unreadInfoTimer: number | null = null; let unreadInfoTimer: number | null = null;
@ -25,11 +26,12 @@ export const useSidebarStore = defineStore('sidebar', {
currentMenuList: [], // 菜单信息 currentMenuList: [], // 菜单信息
unreadInfo: [], // 未读消息 unreadInfo: [], // 未读消息
menuCollapse: false, // 菜单是否折叠 menuCollapse: false, // 菜单是否折叠
hasMenuList: true, // 是否有菜单
}), }),
getters: { getters: {
showSider(): boolean { showSider(): boolean {
const route = router.currentRoute.value; const route = router.currentRoute.value;
return !route.meta?.hideSidebar && this.currentMenuList.length > 0; return !route.meta?.hideSidebar && this.hasMenuList;
}, },
sidebarWidth(): number { sidebarWidth(): number {
if (!this.showSider) return 0; if (!this.showSider) return 0;
@ -49,8 +51,9 @@ export const useSidebarStore = defineStore('sidebar', {
clearMenuCollapse() { clearMenuCollapse() {
this.menuCollapse = false; this.menuCollapse = false;
}, },
setCurrentMenuList(val: any[]) { setCurrentMenuList(newMenuList: any[]) {
this.currentMenuList = val; this.currentMenuList = newMenuList;
this.hasMenuList = newMenuList.length > 0;
}, },
// navbar菜单列表由企业对应权限决定 // navbar菜单列表由企业对应权限决定
// getUserNavbarMenuList() { // getUserNavbarMenuList() {