#ProLayout - 高级布局
ProLayout 可以提供一个标准又不失灵活的中后台标准布局,同时提供一键切换布局形态、自动生成菜单等功能。与 PageContainer 配合使用可以自动生成面包屑、页面标题,并且提供低成本方案接入页脚工具栏。
#何时使用
页面中需要承载内容时,可以使用 ProLayout 来减少布局成本。
#Issue 回归场景
移动端、导航主题与组件 token
import {
CheckCard,
PageContainer,
ProCard,
ProConfigProvider,
ProLayout,
} from '@ant-design/pro-components';
import { Alert, ConfigProvider, Segmented, Space } from 'antd';
import { useState } from 'react';
const routes = [
{
path: '/dashboard',
name: 'Dashboard',
children: [
{ path: '/dashboard/analysis', name: 'Analysis' },
{ path: '/dashboard/monitor', name: 'Monitor' },
],
},
{ path: '/settings', name: 'Settings' },
];
export default () => {
const [navTheme, setNavTheme] = useState<'light' | 'realDark'>('light');
return (
<Space direction="vertical" size={16} style={{ width: '100%' }}>
<Alert
type="info"
showIcon
message="布局与主题 token 回归场景"
description="切换导航主题并悬停 Dashboard,检查深色菜单、弹层背景和 Card token。缩窄窗口可验证移动抽屉。"
/>
<Segmented
value={navTheme}
options={[
{ label: '浅色导航', value: 'light' },
{ label: '真实深色', value: 'realDark' },
]}
onChange={(value) => setNavTheme(value as 'light' | 'realDark')}
/>
<ConfigProvider theme={{ components: { Card: { headerFontSize: 22 } } }}>
<ProConfigProvider
token={{
colorPrimary: '#722ed1',
components: { Card: { headerBg: '#f9f0ff' } },
layout: {
header: { colorBgMenuElevated: '#141414' },
},
}}
>
<ProCard title="ProConfigProvider Card token">
<CheckCard title="CheckCard 继承主题" description="#8929 #9125" />
</ProCard>
<div style={{ height: 480, marginBlockStart: 16 }}>
<ProLayout
title="Regression Demo"
layout="top"
navTheme={navTheme}
route={{ routes }}
location={{ pathname: '/dashboard/analysis' }}
menu={{ request: async () => routes }}
>
<PageContainer title="首屏布局稳定">
移动端抽屉、菜单分组、SSR 与首屏 padding 由对应自动化测试覆盖。
</PageContainer>
</ProLayout>
</div>
</ProConfigProvider>
</ConfigProvider>
</Space>
);
};
#API
#ProLayout
所有以
Render为后缀的方法都可以通过传入false来使其不渲染。
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| title | layout 的左上角的 title | ReactNode | 'Ant Design Pro' | - |
| logo | layout 的左上角 logo 的配置,可以配置url,React 组件 和 false | ReactNode | JSX.Element | WithFalse<() => ReactNode | JSX.Element> | - | - |
| pure | 简约模式,设置了之后不渲染的任何 layout 的东西,但是会有 context,可以获取到当前菜单 | boolean | - | - |
| loading | layout 的加载态,设置完成之后只展示一个 loading | boolean | - | - |
| location | 当前应用会话的位置信息。如果你的应用创建了自定义的 history,则需要显示指定 location 属性,详见 issue | RouterTypes['location'] | isBrowser ? window.location : undefined | - |
| appList | 跨站点导航列表 | AppListProps | - | - |
| appListRender | 自定义跨站点导航列表的 render 方法 | (props: AppListProps, defaultDom: React.ReactNode) => ReactNode | - | - |
| menuHeaderRender | 渲染 logo 和 title, 优先级比 headerTitleRender 更高 | WithFalse<(logo: ReactNode, title: ReactNode, props?: SiderMenuProps) => ReactNode> | - | - |
| menuFooterRender | 在 layout 底部渲染一个块 | WithFalse<(props?: SiderMenuProps) => ReactNode> | - | - |
| onMenuHeaderClick | menu 菜单的头部点击事件 | (e: React.MouseEvent<HTMLDivElement>) => void | - | - |
| menuExtraRender | 在菜单标题的下面渲染一个区域 | WithFalse<(props: SiderMenuProps) => ReactNode> | - | - |
| onTopMixMenuHeaderClick | mix 模式下顶部栏的头部点击事件 | (e: React.MouseEvent<HTMLDivElement>) => void | - | - |
| contentStyle | layout 的内容区 style | CSSProperties | - | - |
| layout | layout 的菜单模式,side:右侧导航,top:顶部导航 | 'side' | 'top' | 'mix' | 'side' | - |
| contentWidth | layout 的内容模式,Fluid:自适应,Fixed:定宽 1200px | 'Fluid' | 'Fixed' | 'Fluid' | - |
| actionRef | layout 的常见操作,比如刷新菜单 | React.MutableRefObject<{reload: () => void} | undefined> | - | - |
| fixedHeader | 是否固定 header 到顶部 | boolean | false | - |
| fixSiderbar | 是否固定导航 | boolean | true | - |
| breakpoint | 触发响应式布局的断点 | Enum { 'xs', 'sm', 'md', 'lg', 'xl', 'xxl' } | lg | - |
| menu | 关于 menu 的配置,暂时只有 locale,locale 可以关闭 menu 的自带的全球化 | menuConfig | { locale: true } | - |
| iconfontUrl | 使用 IconFont 的图标配置 | URL | - | - |
| locale | 当前 layout 的语言设置 | LocaleType ('zh-CN' | 'zh-TW' | 'en-US' | 'it-IT' | 'ko-KR') | navigator.language | - |
| settings | layout 的设置 | Settings | - | - |
| siderWidth | 侧边菜单宽度 | number | mix 模式: 215, 其他: 256 | - |
| suppressSiderWhenMenuEmpty | 在菜单为空时隐藏 Sider | boolean | - | - |
| defaultCollapsed | 默认的菜单的收起和展开,会受到 breakpoint 的影响,breakpoint=false 生效 | boolean | - | - |
| collapsed | 控制菜单的收起和展开,layout 是严格受控的,可以设置为 true,一直收起 | boolean | - | - |
| onCollapse | 收起和展开的时候触发事件 | (collapsed: boolean) => void | - | - |
| onPageChange |