优化Layout

pull/591/head^2
vapao 2022-11-06 10:57:11 +08:00
parent 129d5726af
commit 4cb86923d6
1 changed files with 27 additions and 26 deletions

View File

@ -1,13 +1,13 @@
import React, { useState } from 'react'; import React, { useState, useEffect } from 'react';
import { Layout, Menu } from 'antd'; import { Layout, Menu } from 'antd';
import { hasPermission, history } from 'libs'; import { hasPermission, history } from 'libs';
import styles from './layout.module.less'; import styles from './layout.module.less';
import menus from '../routes'; import routes from '../routes';
import logo from './logo-spug-white.png'; import logo from './logo-spug-white.png';
let selectedKey = window.location.pathname; let selectedKey = window.location.pathname;
const OpenKeysMap = {}; const OpenKeysMap = {};
for (let item of menus) { for (let item of routes) {
if (item.child) { if (item.child) {
for (let sub of item.child) { for (let sub of item.child) {
if (sub.title) OpenKeysMap[sub.path] = item.title if (sub.title) OpenKeysMap[sub.path] = item.title
@ -19,28 +19,30 @@ for (let item of menus) {
export default function Sider(props) { export default function Sider(props) {
const [openKeys, setOpenKeys] = useState([]); const [openKeys, setOpenKeys] = useState([]);
const [menus, setMenus] = useState([]);
function makeMenu(menu) { useEffect(() => {
if (menu.auth && !hasPermission(menu.auth)) return null; const tmp = []
if (!menu.title) return null; for (let item of routes) {
return menu.child ? _makeSubMenu(menu) : _makeItem(menu) const menu = handleRoute(item)
tmp.push(menu)
} }
setMenus(tmp)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
function _makeSubMenu(menu) { function handleRoute(item) {
return ( if (item.auth && !hasPermission(item.auth)) return
<Menu.SubMenu key={menu.title} title={<span>{menu.icon}<span>{menu.title}</span></span>}> if (!item.title) return;
{menu.child.map(menu => makeMenu(menu))} const menu = {label: item.title, key: item.path, icon: item.icon}
</Menu.SubMenu> if (item.child) {
) menu.children = []
for (let sub of item.child) {
const subMenu = handleRoute(sub)
menu.children.push(subMenu)
} }
}
function _makeItem(menu) { return menu
return (
<Menu.Item key={menu.path}>
{menu.icon}
<span>{menu.title}</span>
</Menu.Item>
)
} }
const tmp = window.location.pathname; const tmp = window.location.pathname;
@ -60,13 +62,12 @@ export default function Sider(props) {
<Menu <Menu
theme="dark" theme="dark"
mode="inline" mode="inline"
items={menus}
className={styles.menus} className={styles.menus}
selectedKeys={[selectedKey]} selectedKeys={[selectedKey]}
openKeys={openKeys} openKeys={openKeys}
onOpenChange={setOpenKeys} onOpenChange={setOpenKeys}
onSelect={menu => history.push(menu.key)}> onSelect={menu => history.push(menu.key)}/>
{menus.map(menu => makeMenu(menu))}
</Menu>
</div> </div>
</Layout.Sider> </Layout.Sider>
) )