提交 d32120dc authored 作者: 王鹏飞's avatar 王鹏飞

feat: 优化侧边栏布局,添加侧边栏状态存储和悬停效果

上级 1710568d
...@@ -53,6 +53,7 @@ import logo from '@/assets/images/logo.png' ...@@ -53,6 +53,7 @@ import logo from '@/assets/images/logo.png'
import { getMenuList, checkSSOLogin } from '@/api/base' import { getMenuList, checkSSOLogin } from '@/api/base'
const { Header, Content, Sider } = Layout const { Header, Content, Sider } = Layout
const SIDER_COLLAPSED_STORAGE_KEY = 'kiwi.admin.sider.collapsed'
function getMenuIcon(item, hasChildren) { function getMenuIcon(item, hasChildren) {
const name = item.name || '' const name = item.name || ''
...@@ -173,7 +174,11 @@ export default function AppLayout() { ...@@ -173,7 +174,11 @@ export default function AppLayout() {
const { pathname } = useLocation() const { pathname } = useLocation()
const navigate = useNavigate() const navigate = useNavigate()
const [menuList, setMenuList] = useState([]) const [menuList, setMenuList] = useState([])
const [collapsed, setCollapsed] = useState(false) const [collapsed, setCollapsed] = useState(
() => localStorage.getItem(SIDER_COLLAPSED_STORAGE_KEY) !== 'false',
)
const [siderHovered, setSiderHovered] = useState(false)
const siderCollapsed = collapsed && !siderHovered
const headerOverride = pageHeaderOverrides[pathname] const headerOverride = pageHeaderOverrides[pathname]
const pageTitle = headerOverride?.title || getCurrentMenuTitle(menuList, pathname) const pageTitle = headerOverride?.title || getCurrentMenuTitle(menuList, pathname)
...@@ -208,10 +213,6 @@ export default function AppLayout() { ...@@ -208,10 +213,6 @@ export default function AppLayout() {
})() })()
}, []) }, [])
useEffect(() => {
if (menuList.length) setCollapsed(menuList.length < 3)
}, [menuList.length])
useEffect(() => { useEffect(() => {
if (pathname !== '/books/management' || !menuList.length || hasMenuPath(menuList, pathname)) { if (pathname !== '/books/management' || !menuList.length || hasMenuPath(menuList, pathname)) {
return return
...@@ -226,37 +227,46 @@ export default function AppLayout() { ...@@ -226,37 +227,46 @@ export default function AppLayout() {
return ( return (
<Layout className='layout-container'> <Layout className='layout-container'>
<EditorIconSprite /> <EditorIconSprite />
<Sider <div className={`layout-sider-slot${collapsed ? ' layout-sider-slot--collapsed' : ''}`}>
className='layout-sider' <Sider
width={240} className='layout-sider'
collapsedWidth={64} width={240}
collapsed={collapsed} collapsedWidth={64}
theme='light' collapsed={siderCollapsed}
trigger={null} theme='light'
> trigger={null}
<div className='layout-brand'> onMouseEnter={() => setSiderHovered(true)}
<Link className='layout-brand__logo' to='/' aria-label='返回工作台首页'> onMouseLeave={() => setSiderHovered(false)}
<img src={logo} alt='清控紫荆数智学堂' /> >
</Link> <div className='layout-brand'>
</div> <Link className='layout-brand__logo' to='/' aria-label='返回工作台首页'>
<div className='layout-sider__body'> <img src={logo} alt='清控紫荆数智学堂' />
<Menu menuList={menuList} collapsed={collapsed}></Menu> </Link>
</div> </div>
<Tooltip title={collapsed ? '展开侧边菜单' : '收起侧边菜单'} placement='right'> <div className='layout-sider__body'>
<Button <Menu menuList={menuList} collapsed={siderCollapsed}></Menu>
className='layout-sider-toggle' </div>
type='text' <Tooltip title={collapsed ? '固定展开侧边菜单' : '收起侧边菜单'} placement='right'>
onClick={() => setCollapsed((value) => !value)} <Button
aria-label={collapsed ? '展开侧边菜单' : '收起侧边菜单'} className='layout-sider-toggle'
> type='text'
{collapsed ? ( onClick={() =>
<RiMenuUnfoldLine aria-hidden='true' /> setCollapsed((value) => {
) : ( localStorage.setItem(SIDER_COLLAPSED_STORAGE_KEY, String(!value))
<RiMenuFoldLine aria-hidden='true' /> return !value
)} })
</Button> }
</Tooltip> aria-label={collapsed ? '固定展开侧边菜单' : '收起侧边菜单'}
</Sider> >
{collapsed ? (
<RiMenuUnfoldLine aria-hidden='true' />
) : (
<RiMenuFoldLine aria-hidden='true' />
)}
</Button>
</Tooltip>
</Sider>
</div>
<Layout className='layout-main'> <Layout className='layout-main'>
<Header className='layout-header'> <Header className='layout-header'>
<div className='layout-page-header'> <div className='layout-page-header'>
......
...@@ -5,6 +5,21 @@ ...@@ -5,6 +5,21 @@
background: #fff; background: #fff;
} }
.layout-sider-slot {
flex: 0 0 240px;
width: 240px;
height: 100vh;
}
.layout-sider-slot--collapsed {
flex-basis: 64px;
width: 64px;
.layout-sider:not(.ant-layout-sider-collapsed) {
z-index: 102;
}
}
.layout-sider { .layout-sider {
position: sticky !important; position: sticky !important;
top: 0; top: 0;
......
Markdown 格式
0% 或
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论