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 (