import React, { useState } from 'react'; import './SideMenu.css'; /** * Aurora Admin SideMenu(React) * 对齐 组件7.txt SideMenu 规范:多级、图标、徽章、选中态#F0F5FF+左指示条、折叠悬浮 * * props: * - value / defaultValue : 当前选中 key * - items : [{ key, label, icon?, badge?, children?, disabled? }] * - collapsed * - onSelect(key) */ export default function SideMenu({ value, defaultValue = '', items = [], collapsed = false, onSelect }) { const [active, setActive] = useState(value !== undefined ? value : defaultValue); const [openKeys, setOpenKeys] = useState([]); const [hoverKey, setHoverKey] = useState(''); const [popTop, setPopTop] = useState(0); const current = value !== undefined ? value : active; const select = (key) => { if (value === undefined) setActive(key); onSelect && onSelect(key); setHoverKey(''); }; const onTopClick = (it) => { if (it.disabled) return; if (it.children && it.children.length) { if (collapsed) return; setOpenKeys(openKeys.includes(it.key) ? openKeys.filter(k => k !== it.key) : [...openKeys, it.key]); } else select(it.key); }; const onHover = (it, e) => { if (collapsed && it.children) { setHoverKey(it.key); setPopTop(e.currentTarget.offsetTop); } }; const popItem = items.find(x => x.key === hoverKey) || null; return (
setHoverKey('')}> {items.map(it => { const hasChild = it.children && it.children.length; const isOpen = openKeys.includes(it.key); return (
onTopClick(it)} onMouseEnter={(e) => onHover(it, e)} > {it.icon} {it.label} {it.badge && {it.badge}} {hasChild && ›}
{hasChild && isOpen && !collapsed && (
{it.children.map(c => (
select(c.key)}> {c.label}
))}
)}
); })} {collapsed && hoverKey && popItem && (
{popItem.label}
{popItem.children && popItem.children.length ? ( popItem.children.map(c => (
select(c.key)}> {c.label}
)) ) : (
select(popItem.key)}> {popItem.label}
)}
)}
); } /* 用法示例: import SideMenu from './SideMenu'; const items = [ { key: 'dashboard', label: '仪表盘', icon: '▦' }, { key: 'user', label: '用户管理', icon: '◍', badge: 8, children: [{ key: 'list', label: '用户列表' }] } ]; */