import { FC, useEffect, useRef, useState } from 'react'; import styles from './index.less'; import { history, useLocation, useParams } from 'umi'; import { Menu, Tree } from 'antd'; import { unitAddressList } from '@/services/register'; import eventBus from '@/utils/eventBus'; 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 urlParams = useParams(); const location = useLocation(); 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([]); const [treeKey, setTreeKey] = useState(0); const [treeData, setTreeData] = useState([ { title: 'xxx管理系统', key: 'root', selectable: true, isFolder: true, children: [], } ]); const [treeData1, setTreeData1] = useState([ { title: '所有单位位置', key: 'root', selectable: true, isFolder: true, children: [], } ]); let urlStr = `${urlParams?.fileType}${location?.search}`; useEffect(() => { menuItemsConfig(); }, [location?.pathname]) useEffect(() => { 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); }; }, []) useEffect(() => { eventBus.on('getUnitList', getUnitList); return () => { eventBus.off('getUnitList', getUnitList); }; }, []) const menuItemsConfig = () => { if (`/registerManage/deviceRegister/${urlStr}` == `${location.pathname}${location.search}`) { setMenuItems([ { key: '1', label: '删除' }, { key: '2', label: '刷新' }, ]) } else if (`/registerManage/unitLocation/${urlStr}` == `${location.pathname}${location.search}`) { setMenuItems([ { key: '3', label: '修改' }, { key: '4', label: '刷新' }, { key: '5', label: '新建' }, { key: '6', label: '删除' } ]) getUnitList(); } } // 更新单位位置管理树结构数据 const getUnitList = (type?: string) => { unitAddressList({ pageNum: 1, pageSize: 50}).then((res: any) => { if (res.result == 'success') { res.data[0].list.forEach((val: any) => { val.title = val.unitName; val.key = val.id; }) setTreeData1((e) => { e[0].children = res.data[0].list; return e }) setTreeKey((e: any) => { return e + 1 }) if (type == '添加成功') { setSelectedKeys([Number(res.data[0].list.length)]) }else if (type == '删除成功') { setSelectedKeys(['root']) } } }) } const handleRightClick = (e: any, node: any) => { if (node?.isFolder) return e[0] == 'root' ? eventBus.emit('hideFlag', false) : eventBus.emit('hideFlag', true); e.preventDefault(); setContextMenuPosition({ x: e.clientX, y: e.clientY }); // 记录右键菜单位置 setSelectedKeys([node.key]); // 根据节点设置选中的 keys setShowContextMenu(true); // 显示右键菜单 }; const handleSelect = (selectedKeys: any, name: any) => { selectedKeys[0] == 'root' ? eventBus.emit('hideFlag', false) : eventBus.emit('hideFlag', true); setSelectedKeys(selectedKeys); }; const handleContextMenuClick = (e: any) => { let index = selectedKeys[0] - 1; if(e.key == '3') { eventBus.emit('updateUnitInfo', ['修改', treeData1[0].children[index]]); } else if(e.key == '6') { eventBus.emit('updateUnitInfo', ['删除', treeData1[0].children[index]]); } setShowContextMenu(false); // 隐藏右键菜单 }; const nameType = { "设备注册": treeData, '单位位置管理': treeData1 } const urlType = { "设备注册": '/registerManage/deviceRegister', '单位位置管理': '/registerManage/unitLocation' } 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, { node }) => { if (node.key === 'root') { history.push(`${urlType[item.name]}/${urlStr}`) } handleSelect(e, item.name) }} selectedKeys={selectedKeys} treeData={nameType[item.name]} blockNode={true} defaultExpandAll={true} /> {showContextMenu && (
)}
: // 列表item item.data.map((item1: any, index1: number) => { return (
{ setSelectedKeys([]) history.push(`${item1.url}/${urlStr}`) }}>
{item1.name}
) }) }
) })}
) } export default LeftMenuCom