feat(ideContainer): 优化菜单选中逻辑与数据结构

master
钟良源 4 months ago
parent e148d58e7f
commit a3735d3a5b

@ -3,6 +3,7 @@ export const menuData1 = [
title: '应用列表', title: '应用列表',
path: '', path: '',
key: 'appList', key: 'appList',
parentKey: 'appList',
children: [ children: [
{ {
title: '应用A', title: '应用A',
@ -41,6 +42,7 @@ export const menuData1 = [
{ {
title: '应用编排', title: '应用编排',
key: 'appFlow', key: 'appFlow',
parentKey: 'appFlow',
children: null, children: null,
path: 'appFlow' path: 'appFlow'
}, },
@ -48,19 +50,22 @@ export const menuData1 = [
title: '事件', title: '事件',
children: null, children: null,
path: 'event', path: 'event',
key: 'event' key: 'event',
parentKey: 'event'
}, },
{ {
title: '全局变量', title: '全局变量',
children: null, children: null,
path: 'globalVar', path: 'globalVar',
key: 'globalVar' key: 'globalVar',
parentKey: 'globalVar'
}, },
{ {
title: '组件', title: '组件',
children: null, children: null,
path: 'appCompList', path: 'appCompList',
key: 'appCompList' key: 'appCompList',
parentKey: 'appCompList'
} }
]; ];
@ -68,21 +73,25 @@ export const menuData2 = [
{ {
title: '组件列表', title: '组件列表',
key: 'componentList', key: 'componentList',
parentKey: 'componentList',
children: [ children: [
{ {
title: '我的组件', title: '我的组件',
children: null, children: null,
path: 'myComponents' path: 'myComponents',
parentKey: 'componentList'
}, },
{ {
title: '协同组件', title: '协同组件',
children: null, children: null,
path: 'matchingComponents' path: 'matchingComponents',
parentKey: 'componentList'
}, },
{ {
title: '组件审核', title: '组件审核',
children: null, children: null,
path: 'componentReview' path: 'componentReview',
parentKey: 'componentList'
} }
] ]
}, },
@ -90,19 +99,22 @@ export const menuData2 = [
title: '组件编码', title: '组件编码',
children: null, children: null,
path: 'componentCoding', path: 'componentCoding',
key: 'componentCoding' key: 'componentCoding',
parentKey: 'componentCoding'
}, },
{ {
title: '组件部署', title: '组件部署',
children: null, children: null,
path: 'componentDeployment', path: 'componentDeployment',
key: 'componentDeployment' key: 'componentDeployment',
parentKey: 'componentDeployment'
}, },
{ {
title: '组件测试', title: '组件测试',
children: null, children: null,
path: 'componentTest', path: 'componentTest',
key: 'componentTest' key: 'componentTest',
parentKey: 'componentTest'
} }
]; ];

@ -165,7 +165,8 @@ function IDEContainer() {
if (menuItem) { if (menuItem) {
setSelected({ setSelected({
...menuItem, ...menuItem,
key: menuItem.key || menuItem.parentKey key: menuItem.key,
parentKey: menuItem.parentKey
}); });
} }
} }
@ -192,7 +193,7 @@ function IDEContainer() {
<> <>
<div className={styles.IDEContainer}> <div className={styles.IDEContainer}>
<SideBar <SideBar
selectedKey={selected.key} selected={selected}
identity={urlParams.identity} identity={urlParams.identity}
subMenuData={subMenuData} subMenuData={subMenuData}
onMenuSelect={(select) => setSelected(select)} onMenuSelect={(select) => setSelected(select)}

@ -41,6 +41,7 @@ const NavBar: React.FC<NavBarProps> = ({ selected, menuData, onTabChange, onTabC
if (selected?.path) { if (selected?.path) {
const path = selected.path; const path = selected.path;
const key = selected.key; const key = selected.key;
const parentKey = selected.parentKey;
const title = selected.title; const title = selected.title;
// 检查tab是否已存在 // 检查tab是否已存在
const existingTab = tabs.find(tab => tab.key === (key) && tab.title === title); const existingTab = tabs.find(tab => tab.key === (key) && tab.title === title);
@ -50,6 +51,7 @@ const NavBar: React.FC<NavBarProps> = ({ selected, menuData, onTabChange, onTabC
const title = menuData ? findMenuTitle(selected, menuData, path) : path; const title = menuData ? findMenuTitle(selected, menuData, path) : path;
const newTab = { const newTab = {
key: key, key: key,
parentKey: parentKey,
title: title, title: title,
path: path path: path
}; };
@ -71,7 +73,7 @@ const NavBar: React.FC<NavBarProps> = ({ selected, menuData, onTabChange, onTabC
// 如果删除的是当前激活的tab激活第一个tab如果存在 // 如果删除的是当前激活的tab激活第一个tab如果存在
if (key === activeTab && newTabs.length > 0) { if (key === activeTab && newTabs.length > 0) {
setActiveTab(newTabs[0].key); setActiveTab(newTabs[0].key);
onTabChange?.(newTabs[0].path); onTabChange?.(newTabs[0].key);
} }
else if (key === activeTab && newTabs.length === 0) { else if (key === activeTab && newTabs.length === 0) {
setActiveTab(''); setActiveTab('');
@ -85,10 +87,10 @@ const NavBar: React.FC<NavBarProps> = ({ selected, menuData, onTabChange, onTabC
const handleTabChange = (key: string) => { const handleTabChange = (key: string) => {
setActiveTab(key); setActiveTab(key);
// 查找对应的tab并通知父组件 // 查找对应的tab并通知父组件
// const tab = tabs.find(t => t.key === key); const tab = tabs.find(t => t.key === key);
// if (tab) { if (tab) {
// onTabChange?.(tab.key); onTabChange?.(tab.key);
// } }
}; };
return ( return (

@ -24,7 +24,7 @@ interface MenuItemType {
interface SideBarProps { interface SideBarProps {
subMenuData: any; subMenuData: any;
selectedKey?: string; selected?: any;
identity?: string; identity?: string;
onMenuSelect?: (selected: Selected) => void; onMenuSelect?: (selected: Selected) => void;
} }
@ -34,12 +34,11 @@ const compTypeMap = {
subComponent: '复合组件' subComponent: '复合组件'
}; };
const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, onMenuSelect }) => { const SideBar: React.FC<SideBarProps> = ({ selected, identity, subMenuData, onMenuSelect }) => {
const [menu, setMenu] = useState<MenuItemType[]>([]); const [menu, setMenu] = useState<MenuItemType[]>([]);
const [subMenuWidth, setSubMenuWidth] = useState(300); // 子菜单宽度状态 const [subMenuWidth, setSubMenuWidth] = useState(300); // 子菜单宽度状态
const [isSubMenuCollapsed, setIsSubMenuCollapsed] = useState(false); // 子菜单收起状态 const [isSubMenuCollapsed, setIsSubMenuCollapsed] = useState(false); // 子菜单收起状态
const [activeKey, setActiveKey] = useState(0); const [activeKey, setActiveKey] = useState(0);
const [mainMenuSelectedKey, setMainMenuSelectedKey] = useState<string>('');
const { menuData } = useSelector(state => state.ideContainer); const { menuData } = useSelector(state => state.ideContainer);
const dispatch = useDispatch(); const dispatch = useDispatch();
@ -94,7 +93,7 @@ const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, o
const handleMenuItemClick = (item: MenuItemType, index: number) => { const handleMenuItemClick = (item: MenuItemType, index: number) => {
setActiveKey(index); setActiveKey(index);
// 如果点击的是当前已激活的菜单项,则切换子菜单的展开/收起状态 // 如果点击的是当前已激活的菜单项,则切换子菜单的展开/收起状态
if (selectedKey === `${item.key}`) { if (selected.key === `${item.key}`) {
toggleSubMenu(); toggleSubMenu();
} }
else { else {
@ -105,8 +104,6 @@ const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, o
} }
} }
const mainMenuKey = `${item.key}`;
setMainMenuSelectedKey(mainMenuKey);
// 调用外部传入的菜单选择处理函数 // 调用外部传入的菜单选择处理函数
onMenuSelect?.({ ...item }); onMenuSelect?.({ ...item });
}; };
@ -192,7 +189,7 @@ const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, o
{menu.map((item, index) => ( {menu.map((item, index) => (
<div <div
key={index} key={index}
className={`${styles['menu-item']} ${(selectedKey === `${item.key}` || mainMenuSelectedKey === `${item.key}`) ? styles['menu-item-active'] : ''}`} className={`${styles['menu-item']} ${(selected.parentKey === `${item.parentKey}`) ? styles['menu-item-active'] : ''}`}
onClick={() => handleMenuItemClick(item, index)} onClick={() => handleMenuItemClick(item, index)}
> >
<div className={styles['menu-item-content']}> <div className={styles['menu-item-content']}>
@ -240,9 +237,6 @@ const SideBar: React.FC<SideBarProps> = ({ selectedKey, identity, subMenuData, o
const selectedNode = info.node; const selectedNode = info.node;
const originalData = selectedNode.props.dataRef; const originalData = selectedNode.props.dataRef;
await getProjectEnvData(originalData); await getProjectEnvData(originalData);
// 保持主菜单的选中状态
const mainMenuKey = `${menu[activeKey]?.key}`;
setMainMenuSelectedKey(mainMenuKey);
// 调用外部传入的菜单选择处理函数 // 调用外部传入的菜单选择处理函数
originalData.key && onMenuSelect?.({ ...originalData } as Selected); originalData.key && onMenuSelect?.({ ...originalData } as Selected);

Loading…
Cancel
Save