1. import React, { useRef, useState } from 'react';
    2. import { Link, useHistory } from 'umi';
    3. import { Avatar } from 'antd';
    4. import { UserOutlined } from '@ant-design/icons';
    5. import type { MenuDataItem, ProSettings } from '@ant-design/pro-layout';
    6. import ProLayout from '@ant-design/pro-layout';
    7. const LayoutPage = (props: any) => {
    8. const { children } = props;
    9. const history = useHistory();
    10. // ProLayout配置
    11. const [settings, setSetting] = useState<Partial<ProSettings> | undefined>({
    12. // 是否固定导航
    13. fixSiderbar: true,
    14. // layout 的菜单模式,side:右侧导航,top:顶部导航
    15. layout: 'top',
    16. // 是否固定 header 到顶部
    17. fixedHeader: true,
    18. });
    19. // 当前的匹配的页面
    20. const [pathname, setPathname] = useState('/');
    21. // 路由列表
    22. const routers = props.route.routes || [];
    23. // menuDataRender
    24. const menuDataRender = (menuList: MenuDataItem[]): MenuDataItem[] => {
    25. // 过滤权限路由
    26. return menuList.map((item) => {
    27. const localItem = {
    28. ...item,
    29. routes: item.routes ? menuDataRender(item.routes) : undefined,
    30. };
    31. return localItem;
    32. });
    33. };
    34. const menuDataRef = useRef<MenuDataItem[]>([]);
    35. return (
    36. <div
    37. id="test-pro-layout"
    38. style={{
    39. height: '100vh',
    40. }}
    41. >
    42. <ProLayout
    43. // 当前应用会话的位置信息。如果你的应用创建了自定义的 history,则需要显示指定 location 属性
    44. location={{pathname}}
    45. // menu 菜单的头部点击事件
    46. onMenuHeaderClick={() => history.push('/')}
    47. // 自定义菜单项的 render 方法
    48. menuItemRender={(menuItemProps, defaultDom) => {
    49. if (
    50. menuItemProps.isUrl ||
    51. !menuItemProps.path ||
    52. location.pathname === menuItemProps.path
    53. ) {
    54. return defaultDom;
    55. }
    56. return <Link to={menuItemProps.path}>{defaultDom}</Link>;
    57. }}
    58. // 在显示前对菜单数据进行查看,修改不会触发重新渲染
    59. postMenuData={(menuData) => {
    60. menuDataRef.current = menuData || [];
    61. return menuData || [];
    62. }}
    63. // menuData 的 render 方法,用来自定义 menuData
    64. menuDataRender={menuDataRender}
    65. // layout 的内容模式,Fluid:自适应,Fixed:定宽 1200px
    66. contentWidth={'Fluid'}
    67. // 顶部当前用户
    68. rightContentRender={() => (
    69. <div>
    70. <Avatar shape="square" size="small" icon={<UserOutlined />} />
    71. </div>
    72. )}
    73. // layout 的内容区 style
    74. contentStyle={{}}
    75. // layout 的设置
    76. {...settings}
    77. {...props}
    78. >
    79. {children}
    80. </ProLayout>
    81. </div>
    82. );
    83. };
    84. export default LayoutPage;