import { FC, useEffect, useRef, useState } from 'react'; import styles from './index.less'; import { history, useLocation, useParams } from 'umi'; import { Menu, Tree } from 'antd'; interface PageProps { data: Array<{ // 菜单名称 name: string; // 是否展开 check: boolean; // 内容是否有目录结构 isTree?: boolean; // 菜单列表 : name: 名称; url: 路由; img: 图标; data: Array<{ name: string; url: string; img: any; }> }>; } const LeftMenuCom: FC = ({ data }) => { const [list, setList] = useState([]); const route = useLocation(); const urlParams = useParams(); const [selectedKeys, setSelectedKeys] = useState([]); const [contextMenuPosition, setContextMenuPosition] = useState({ x: 0, y: 0 }); const [showContextMenu, setShowContextMenu] = useState(false); const treeRef = useRef(null); const [menuItems, setMenuItems] = useState([]); useEffect(() => { menuItemsConfig(); data.forEach((item, index) => { // 默认展开第一个 // item.check = (index == 0 ? true : false); // 默认全部展开 item.check = true; if (item?.isTree) setSelectedKeys([urlParams?.id]) }) setList([...data]) const handleClickOutside = (e: any) => { if (treeRef.current && !treeRef.current.contains(e.target)) { // 点击了 MyTree 组件以外的地方,隐藏菜单 setShowContextMenu(false); } }; document.addEventListener('click', handleClickOutside); return () => { document.removeEventListener('click', handleClickOutside); }; }, []) const menuItemsConfig = () => { if (`/registerManage/deviceRegister/${urlParams?.id}` == route?.pathname) { setMenuItems([ {key: '1', label: '删除'}, {key: '2', label: '刷新'}, ]) }else if (`/registerManage/unitLocation/${urlParams?.id}` == route?.pathname) { setMenuItems([ {key: '1', label: '修改'}, {key: '2', label: '刷新'}, {key: '3', label: '新建'}, {key: '4', label: '删除'} ]) } } const handleRightClick = (e: any, node: any) => { if (node?.isFolder) return e.preventDefault(); setContextMenuPosition({ x: e.clientX, y: e.clientY }); // 记录右键菜单位置 setSelectedKeys([node.key]); // 根据节点设置选中的 keys setShowContextMenu(true); // 显示右键菜单 }; const handleSelect = (selectedKeys: any, name: any) => { if (selectedKeys.length == 0) return; setSelectedKeys(selectedKeys); switch (name) { case '设备注册': history.push(`/registerManage/deviceRegister/${selectedKeys[0]}`) break; case '单位位置管理': history.push(`/registerManage/unitLocation/${selectedKeys[0]}`) break; } }; const handleContextMenuClick = (e: any) => { setShowContextMenu(false); // 隐藏右键菜单 }; const treeData = [ { title: 'Parent 1', key: '0-1', selectable: false, isFolder: true, children: [ { title: 'Child 1', key: '0-1-1', }, { title: 'Child 2', key: '0-1-2', }, ], }, { title: 'Parent 2', key: '0-2', selectable: false, isFolder: true, children: [ { title: 'Child 3', key: '0-2-1', }, { title: 'Child 4', key: '0-2-2', }, ], }, ]; return (
{list.map((item: any, index: number) => { return (
{/* 类型 */}
{ list[index].check = !list[index].check; setList([...list]) }}>
{item.name}
{/* 列表 */}
{ item?.isTree ? // 树结构
e.preventDefault()} onRightClick={({ event, node }) => handleRightClick(event, node)} onSelect={(e) => { handleSelect(e, item.name) }} selectedKeys={selectedKeys} treeData={treeData} blockNode={true} defaultExpandAll={true} /> {showContextMenu && (
)}
: // 列表item item.data.map((item1: any, index1: number) => { return (
{ setSelectedKeys([]) history.push(item1.url) }}>
{item1.name}
) }) }
) })}
) } export default LeftMenuCom