提交 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,13 +227,16 @@ export default function AppLayout() { ...@@ -226,13 +227,16 @@ export default function AppLayout() {
return ( return (
<Layout className='layout-container'> <Layout className='layout-container'>
<EditorIconSprite /> <EditorIconSprite />
<div className={`layout-sider-slot${collapsed ? ' layout-sider-slot--collapsed' : ''}`}>
<Sider <Sider
className='layout-sider' className='layout-sider'
width={240} width={240}
collapsedWidth={64} collapsedWidth={64}
collapsed={collapsed} collapsed={siderCollapsed}
theme='light' theme='light'
trigger={null} trigger={null}
onMouseEnter={() => setSiderHovered(true)}
onMouseLeave={() => setSiderHovered(false)}
> >
<div className='layout-brand'> <div className='layout-brand'>
<Link className='layout-brand__logo' to='/' aria-label='返回工作台首页'> <Link className='layout-brand__logo' to='/' aria-label='返回工作台首页'>
...@@ -240,14 +244,19 @@ export default function AppLayout() { ...@@ -240,14 +244,19 @@ export default function AppLayout() {
</Link> </Link>
</div> </div>
<div className='layout-sider__body'> <div className='layout-sider__body'>
<Menu menuList={menuList} collapsed={collapsed}></Menu> <Menu menuList={menuList} collapsed={siderCollapsed}></Menu>
</div> </div>
<Tooltip title={collapsed ? '展开侧边菜单' : '收起侧边菜单'} placement='right'> <Tooltip title={collapsed ? '固定展开侧边菜单' : '收起侧边菜单'} placement='right'>
<Button <Button
className='layout-sider-toggle' className='layout-sider-toggle'
type='text' type='text'
onClick={() => setCollapsed((value) => !value)} onClick={() =>
aria-label={collapsed ? '展开侧边菜单' : '收起侧边菜单'} setCollapsed((value) => {
localStorage.setItem(SIDER_COLLAPSED_STORAGE_KEY, String(!value))
return !value
})
}
aria-label={collapsed ? '固定展开侧边菜单' : '收起侧边菜单'}
> >
{collapsed ? ( {collapsed ? (
<RiMenuUnfoldLine aria-hidden='true' /> <RiMenuUnfoldLine aria-hidden='true' />
...@@ -257,6 +266,7 @@ export default function AppLayout() { ...@@ -257,6 +266,7 @@ export default function AppLayout() {
</Button> </Button>
</Tooltip> </Tooltip>
</Sider> </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 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论