|
|
|
@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react';
|
|
|
|
import styles from './style/sideBar.module.less';
|
|
|
|
import styles from './style/sideBar.module.less';
|
|
|
|
import { IconApps } from '@arco-design/web-react/icon';
|
|
|
|
import { IconApps } from '@arco-design/web-react/icon';
|
|
|
|
import { menuData, menuData2 } from './config/menuData';
|
|
|
|
import { menuData, menuData2 } from './config/menuData';
|
|
|
|
|
|
|
|
import { ResizeBox } from '@arco-design/web-react';
|
|
|
|
|
|
|
|
|
|
|
|
interface MenuItemType {
|
|
|
|
interface MenuItemType {
|
|
|
|
title: string;
|
|
|
|
title: string;
|
|
|
|
@ -19,6 +20,8 @@ interface SideBarProps {
|
|
|
|
|
|
|
|
|
|
|
|
const SideBar: React.FC<SideBarProps> = ({ onMenuSelect, selectedKey, identity }) => {
|
|
|
|
const SideBar: React.FC<SideBarProps> = ({ onMenuSelect, selectedKey, identity }) => {
|
|
|
|
const [menu, setMenu] = useState<MenuItemType[]>([]);
|
|
|
|
const [menu, setMenu] = useState<MenuItemType[]>([]);
|
|
|
|
|
|
|
|
const [subMenuWidth, setSubMenuWidth] = useState(200); // 子菜单宽度状态
|
|
|
|
|
|
|
|
const [isSubMenuCollapsed, setIsSubMenuCollapsed] = useState(false); // 子菜单收起状态
|
|
|
|
|
|
|
|
|
|
|
|
function getMenuData(): MenuItemType[] {
|
|
|
|
function getMenuData(): MenuItemType[] {
|
|
|
|
switch (identity) {
|
|
|
|
switch (identity) {
|
|
|
|
@ -31,6 +34,36 @@ const SideBar: React.FC<SideBarProps> = ({ onMenuSelect, selectedKey, identity }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 处理子菜单区域的拖拽调整大小
|
|
|
|
|
|
|
|
const handleSubMenuResize = (e: MouseEvent, { width }: { width: number }) => {
|
|
|
|
|
|
|
|
setSubMenuWidth(width);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 切换子菜单区域的收起/展开状态
|
|
|
|
|
|
|
|
const toggleSubMenu = () => {
|
|
|
|
|
|
|
|
setIsSubMenuCollapsed(!isSubMenuCollapsed);
|
|
|
|
|
|
|
|
setSubMenuWidth(isSubMenuCollapsed ? 200 : 0);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 处理菜单项点击事件
|
|
|
|
|
|
|
|
const handleMenuItemClick = (item: MenuItemType) => {
|
|
|
|
|
|
|
|
console.log("item:",item);
|
|
|
|
|
|
|
|
// 如果点击的是当前已激活的菜单项,则切换子菜单的展开/收起状态
|
|
|
|
|
|
|
|
if (selectedKey === `${item.key}`) {
|
|
|
|
|
|
|
|
toggleSubMenu();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
// 如果点击的是其他菜单项,则展开子菜单(如果已收起)
|
|
|
|
|
|
|
|
if (isSubMenuCollapsed) {
|
|
|
|
|
|
|
|
setIsSubMenuCollapsed(false);
|
|
|
|
|
|
|
|
setSubMenuWidth(200);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 调用外部传入的菜单选择处理函数
|
|
|
|
|
|
|
|
onMenuSelect?.({ currentPath: item.path, currentKey: `${item.key}` });
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
useEffect(() => {
|
|
|
|
setMenu(getMenuData());
|
|
|
|
setMenu(getMenuData());
|
|
|
|
}, [identity]);
|
|
|
|
}, [identity]);
|
|
|
|
@ -44,9 +77,7 @@ const SideBar: React.FC<SideBarProps> = ({ onMenuSelect, selectedKey, identity }
|
|
|
|
<div
|
|
|
|
<div
|
|
|
|
key={index}
|
|
|
|
key={index}
|
|
|
|
className={`${styles['menu-item']} ${selectedKey === `${item.key}` ? styles['menu-item-active'] : ''}`}
|
|
|
|
className={`${styles['menu-item']} ${selectedKey === `${item.key}` ? styles['menu-item-active'] : ''}`}
|
|
|
|
onClick={() => {
|
|
|
|
onClick={() => handleMenuItemClick(item)}
|
|
|
|
onMenuSelect?.({ currentPath: item.path, currentKey: `${item.key}` });
|
|
|
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
>
|
|
|
|
>
|
|
|
|
<div className={styles['menu-item-content']}>
|
|
|
|
<div className={styles['menu-item-content']}>
|
|
|
|
<span className={styles['menu-item-icon']}>
|
|
|
|
<span className={styles['menu-item-icon']}>
|
|
|
|
@ -59,6 +90,25 @@ const SideBar: React.FC<SideBarProps> = ({ onMenuSelect, selectedKey, identity }
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
))}
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<ResizeBox
|
|
|
|
|
|
|
|
directions={['right']}
|
|
|
|
|
|
|
|
style={{
|
|
|
|
|
|
|
|
width: subMenuWidth,
|
|
|
|
|
|
|
|
height: '100%',
|
|
|
|
|
|
|
|
minHeight: 'calc(100vh - 60px)'
|
|
|
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
onMoving={handleSubMenuResize}
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
<div style={{
|
|
|
|
|
|
|
|
width: '100%',
|
|
|
|
|
|
|
|
height: '100%',
|
|
|
|
|
|
|
|
backgroundColor: '#f5f5f5',
|
|
|
|
|
|
|
|
borderRight: '1px solid #ddd',
|
|
|
|
|
|
|
|
position: 'relative'
|
|
|
|
|
|
|
|
}}>
|
|
|
|
|
|
|
|
子菜单区域
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</ResizeBox>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|