import React, { useRef, useState } from 'react';
import { Link, useHistory } from 'umi';
import { Avatar } from 'antd';
import { UserOutlined } from '@ant-design/icons';
import type { MenuDataItem, ProSettings } from '@ant-design/pro-layout';
import ProLayout from '@ant-design/pro-layout';
const LayoutPage = (props: any) => {
const { children } = props;
const history = useHistory();
// ProLayout配置
const [settings, setSetting] = useState<Partial<ProSettings> | undefined>({
// 是否固定导航
fixSiderbar: true,
// layout 的菜单模式,side:右侧导航,top:顶部导航
layout: 'top',
// 是否固定 header 到顶部
fixedHeader: true,
});
// 当前的匹配的页面
const [pathname, setPathname] = useState('/');
// 路由列表
const routers = props.route.routes || [];
// menuDataRender
const menuDataRender = (menuList: MenuDataItem[]): MenuDataItem[] => {
// 过滤权限路由
return menuList.map((item) => {
const localItem = {
...item,
routes: item.routes ? menuDataRender(item.routes) : undefined,
};
return localItem;
});
};
const menuDataRef = useRef<MenuDataItem[]>([]);
return (
<div
id="test-pro-layout"
style={{
height: '100vh',
}}
>
<ProLayout
// 当前应用会话的位置信息。如果你的应用创建了自定义的 history,则需要显示指定 location 属性
location={{pathname}}
// menu 菜单的头部点击事件
onMenuHeaderClick={() => history.push('/')}
// 自定义菜单项的 render 方法
menuItemRender={(menuItemProps, defaultDom) => {
if (
menuItemProps.isUrl ||
!menuItemProps.path ||
location.pathname === menuItemProps.path
) {
return defaultDom;
}
return <Link to={menuItemProps.path}>{defaultDom}</Link>;
}}
// 在显示前对菜单数据进行查看,修改不会触发重新渲染
postMenuData={(menuData) => {
menuDataRef.current = menuData || [];
return menuData || [];
}}
// menuData 的 render 方法,用来自定义 menuData
menuDataRender={menuDataRender}
// layout 的内容模式,Fluid:自适应,Fixed:定宽 1200px
contentWidth={'Fluid'}
// 顶部当前用户
rightContentRender={() => (
<div>
<Avatar shape="square" size="small" icon={<UserOutlined />} />
</div>
)}
// layout 的内容区 style
contentStyle={{}}
// layout 的设置
{...settings}
{...props}
>
{children}
</ProLayout>
</div>
);
};
export default LayoutPage;