refactor(left-menu): 重构左侧菜单组件状态管理

- 添加 useState 和 useEffect 钩子管理菜单状态
- 将菜单展开状态和激活菜单项改为状态变量
- 实现动态子菜单列表管理功能
- 修复菜单项点击事件类型转换问题
- 优化菜单展开状态更新逻辑
- 删除过时的付款编码字段定义
This commit is contained in:
shenyifei 2026-01-08 11:39:38 +08:00
parent f36678fe6c
commit f68b148319
2 changed files with 116 additions and 112 deletions

View File

@ -2,7 +2,7 @@ import {MenuDataItem} from '@ant-design/pro-components';
import { getMatchMenu } from '@umijs/route-utils'; import { getMatchMenu } from '@umijs/route-utils';
import { Layout, Menu } from 'antd'; import { Layout, Menu } from 'antd';
import { MenuItemType } from 'antd/es/menu/interface'; import { MenuItemType } from 'antd/es/menu/interface';
import React from 'react'; import React, { useEffect, useState } from 'react';
import useButtonStyle from './style.style'; import useButtonStyle from './style.style';
interface ILeftMenuProps { interface ILeftMenuProps {
@ -59,10 +59,6 @@ const LeftMenu: React.FC<ILeftMenuProps> = (props) => {
const { styles } = useButtonStyle(); const { styles } = useButtonStyle();
const { pathname, menuData, onClick } = props; const { pathname, menuData, onClick } = props;
if (!menuData) {
return null;
}
// 根据提供的 menuData 提供的 tree 结构,获取第一层等级菜单 // 根据提供的 menuData 提供的 tree 结构,获取第一层等级菜单
// moduleMenu // moduleMenu
const moduleMenu = menuData.map((item: MenuDataItem) => { const moduleMenu = menuData.map((item: MenuDataItem) => {
@ -73,19 +69,28 @@ const LeftMenu: React.FC<ILeftMenuProps> = (props) => {
} as MenuItemType; } as MenuItemType;
}); });
const [openKeys, setOpenKeys] = useState<string[]>([]);
const [activeMenuKey, setActiveMenuKey] = useState<string[]>();
const [subMenuList, setSubMenuList] = useState<MenuItemType[]>([]);
useEffect(() => {
// 通过循环 moduleMenu 判断 history.location.pathname 是否包含 key // 通过循环 moduleMenu 判断 history.location.pathname 是否包含 key
const activeMenu = getMatchMenu(pathname, menuData, true); const activeMenu = getMatchMenu(pathname, menuData, true);
// pluck activeMenu key
const activeMenuKey = activeMenu.map( const activeMenuKey = activeMenu.map(
(item: MenuDataItem) => item.key as string, (item: MenuDataItem) => item.key as string,
); );
const openKeys = activeMenu.flatMap((item: MenuDataItem) => item.children).map(
(item: any) => item?.key as string,
);
let subMenu: MenuItemType[] = []; setSubMenuList(
if (activeMenu[0]?.children) { activeMenu[0]?.children
subMenu = defaultFilterMenuData(activeMenu[0]?.children); ? defaultFilterMenuData(activeMenu[0]?.children)
: [],
);
setActiveMenuKey(activeMenuKey);
setOpenKeys([...openKeys, ...activeMenuKey]);
}, [pathname]);
if (!menuData) {
return null;
} }
return ( return (
@ -94,7 +99,7 @@ const LeftMenu: React.FC<ILeftMenuProps> = (props) => {
className={styles.box} className={styles.box}
style={{ style={{
// @ts-ignore // @ts-ignore
'--box-with': subMenu.length > 0 ? '248px' : '100px', '--box-with': subMenuList.length > 0 ? '248px' : '100px',
}} }}
></div> ></div>
<Layout.Sider <Layout.Sider
@ -109,19 +114,20 @@ const LeftMenu: React.FC<ILeftMenuProps> = (props) => {
selectedKeys={activeMenuKey} selectedKeys={activeMenuKey}
theme={'dark'} theme={'dark'}
onClick={(item) => { onClick={(item) => {
onClick(item); onClick(item as any);
}} }}
/> />
{subMenu.length > 0 && ( {subMenuList.length > 0 && (
<Menu <Menu
items={subMenu} items={subMenuList}
className={styles.subMenu} className={styles.subMenu}
selectedKeys={activeMenuKey} selectedKeys={activeMenuKey}
openKeys={openKeys} openKeys={openKeys}
onOpenChange={(keys) => setOpenKeys(keys)}
mode="inline" mode="inline"
inlineIndent={12} inlineIndent={12}
onClick={(item) => { onClick={(item) => {
onClick(item); onClick(item as any);
}} }}
/> />
)} )}

View File

@ -4908,8 +4908,6 @@ declare namespace BusinessAPI {
taskName: string; taskName: string;
/** 任务类型1-瓜农付款任务 */ /** 任务类型1-瓜农付款任务 */
taskType: 'MELON_FARMER'; taskType: 'MELON_FARMER';
/** 付款编码 */
paymentTaskSn: string;
/** 付款任务对象ID */ /** 付款任务对象ID */
targetId: string; targetId: string;
/** 付款总金额 */ /** 付款总金额 */