• 中文
  • 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 来使其不渲染。

    参数说明类型默认值版本
    titlelayout 的左上角的 titleReactNode'Ant Design Pro'-
    logolayout 的左上角 logo 的配置,可以配置url,React 组件 和 falseReactNode | JSX.Element | WithFalse<() => ReactNode | JSX.Element>--
    pure简约模式,设置了之后不渲染的任何 layout 的东西,但是会有 context,可以获取到当前菜单boolean--
    loadinglayout 的加载态,设置完成之后只展示一个 loadingboolean--
    location当前应用会话的位置信息。如果你的应用创建了自定义的 history,则需要显示指定 location 属性,详见 issueRouterTypes['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>--
    onMenuHeaderClickmenu 菜单的头部点击事件(e: React.MouseEvent<HTMLDivElement>) => void--
    menuExtraRender在菜单标题的下面渲染一个区域WithFalse<(props: SiderMenuProps) => ReactNode>--
    onTopMixMenuHeaderClickmix 模式下顶部栏的头部点击事件(e: React.MouseEvent<HTMLDivElement>) => void--
    contentStylelayout 的内容区 styleCSSProperties--
    layoutlayout 的菜单模式,side:右侧导航,top:顶部导航'side' | 'top' | 'mix''side'-
    contentWidthlayout 的内容模式,Fluid:自适应,Fixed:定宽 1200px'Fluid' | 'Fixed''Fluid'-
    actionReflayout 的常见操作,比如刷新菜单React.MutableRefObject<{reload: () => void} | undefined>--
    fixedHeader是否固定 header 到顶部booleanfalse-
    fixSiderbar是否固定导航booleantrue-
    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-
    settingslayout 的设置Settings--
    siderWidth侧边菜单宽度numbermix 模式: 215, 其他: 256-
    suppressSiderWhenMenuEmpty在菜单为空时隐藏 Siderboolean--
    defaultCollapsed默认的菜单的收起和展开,会受到 breakpoint 的影响,breakpoint=false 生效boolean--
    collapsed控制菜单的收起和展开,layout 是严格受控的,可以设置为 true,一直收起boolean--
    onCollapse收起和展开的时候触发事件(collapsed: boolean) => void--
    onPageChange页面切换的时候触发(location?: RouterTypes['location']) => void--
    headerRender自定义头的 render 方法WithFalse<(props: ProLayoutProps & {hasSiderMenu?: boolean}, defaultDom: ReactNode) => ReactNode>--
    headerTitleRender自定义头标题的方法,mix 模式和 top 模式下生效WithFalse<(logo: ReactNode, title: ReactNode, props: HeaderViewProps) => ReactNode>--
    headerContentRender自定义头内容的方法WithFalse<(props: HeaderViewProps, defaultDom: ReactNode) => ReactNode>--
    avatarPropslayout 的头像设置,不同的 layout 放在不同的位置WithFalse<AvatarProps & {title?: ReactNode, render?: (avatarProps: AvatarProps, defaultDom: ReactNode, props: SiderMenuProps) => ReactNode}>--
    actionsRenderLayout的操作功能列表,不同的 layout 会放到不同的位置WithFalse<(props: HeaderViewProps) => ReactNode[] | ReactNode>--
    collapsedButtonRender自定义展开收起按钮的渲染WithFalse<(collapsed: boolean) => ReactNode>--
    footerRender自定义页脚的 render 方法WithFalse<(props: ProLayoutProps & {hasSiderMenu?: boolean}, defaultDom: ReactNode) => ReactNode>--
    pageTitleRender自定义页面标题的显示方法WithFalse<(props: GetPageTitleProps, defaultPageTitle?: string, info?: {title: string, id: string, pageName: string}) => string>--
    menuRender虽然叫menuRender,但是其实是整个 SiderMenu 面板的渲染函数WithFalse<(props: HeaderViewProps, defaultDom: ReactNode) => ReactNode>--
    postMenuData在显示前对菜单数据进行查看,修改不会触发重新渲染(menuData: MenuDataItem[]) => MenuDataItem[]--
    menuItemRender自定义菜单项的 render 方法(itemProps: MenuDataItem, defaultDom: ReactNode, props: BaseMenuProps) => ReactNode--
    subMenuItemRender自定义拥有子菜单菜单项的 render 方法(itemProps: MenuDataItem) => ReactNode--
    menuDataRender处理 menuData 的数据,可以动态的控制数据(menuData: MenuDataItem[]) => MenuDataItem[]--
    breadcrumbRender设置 PageHeader 的面包屑,只能处理数据WithFalse<(routers: BreadcrumbProps['items']) => BreadcrumbProps['items']>--
    breadcrumbPropsPageHeader 的 BreadcrumbProps 配置,会透传下去Omit<BreadcrumbProps, 'itemRender'> & LayoutBreadcrumbProps--
    itemRender处理每个面包屑的配置,需要直接返回 domBreadcrumbProps['itemRender']--
    route用于生成菜单和面包屑。Umi 的 Layout 会自动带有route--
    disableMobile是否禁用移动端模式booleanfalse-
    ErrorBoundary错误处理组件React.ComponentClass<any, any> | boolean内置 ErrorBoundary-
    links显示在菜单右下角的快捷操作ReactNode[]--
    menuProps传递到 antd menu 组件的 props, 参考 导航菜单MenuProps--
    waterMarkProps水印的相关配置WatermarkProps--
    formatMessage国际化方法(message: MessageDescriptor) => string--
    siderMenuType侧边菜单的类型, menu.type 的快捷方式'sub' | 'group'--
    isChildrenLayout是否为子布局boolean--
    bgLayoutImgListLayout 的品牌配置,表现为一张背景图片{src?: string, width?: string, height?: string, left?: number, top?: number, bottom?: number, right?: number}[]--
    stylish样式配置{header?: GenerateStyle<SiderMenuToken>, sider?: GenerateStyle<SiderMenuToken>}--
    className外层容器的 classNamestring--
    style外层容器的 styleReact.CSSProperties--
    tokenLayout 的 token 配置ProTokenType['layout']--

    menu 中支持了部分常用的 menu 配置,可以帮助我们更好的管理 menu

    参数说明类型默认值版本
    autoClose选中菜单是否自动关闭菜单falsetrue-
    collapsedShowGroupTitle收起时也展示分组菜单的标题boolean--
    collapsedShowTitle收起时也展示标题boolean--
    collapsedWidth菜单收起时的宽度number--
    defaultOpenAll默认打开所有的菜单项,要注意只有 layout 挂载之前生效,异步加载菜单是不支持的booleanfalse-
    hideMenuWhenCollapsed菜单收起时隐藏菜单面板boolean--
    ignoreFlatMenu是否忽略手动折叠过的菜单状态,结合 defaultOpenAll 可实现折叠按钮切换后,同样可以展开所有子菜单booleanfalse-
    loading菜单是否正在加载中booleanfalse-
    localemenu 是否使用国际化,还需要 formatMessage 的配合booleantrue-
    onLoadingChange菜单的加载状态变更(loading: boolean) => void--
    params菜单远程请求时用的参数,只有 params 变化才会重新触发 requestRecord<string, any>--
    request远程加载菜单的方法,会自动修改 loading 状态(params, defaultMenuData) => Promise<MenuDataItem[]>--
    type菜单的类型'sub' | 'group''group'-

    SettingDrawer

    参数说明类型默认值版本
    collapse控制 SettingDrawer 的收起和展开boolean--
    colorList自带的颜色切换系统 (ColorList 的 title 会作为 Tooltip 显示)ColorList--
    disableUrlParams禁止同步设置到查询参数booleanfalse-
    enableDarkTheme打开黑色主题切换功能booleanfalse-
    hideCopyButton不展示 copy 功能boolean--
    hideHintAlert删除下方的提示信息boolean--
    onCollapseChangeSettingDrawer 的折叠收起事件(collapsed: boolean) => void--
    onSettingChangeSettings 发生更改事件(settings: Settings) => void--
    settingslayout 的设置Settings--

    自带的颜色列表

    const colorList = [
      { key: 'daybreak', color: '#1890ff' },
      { key: 'dust', color: '#F5222D' },
      { key: 'volcano', color: '#FA541C' },
      { key: 'sunset', color: '#FAAD14' },
      { key: 'cyan', color: '#13C2C2' },
      { key: 'green', color: '#52C41A' },
      { key: 'geekblue', color: '#2F54EB' },
      { key: 'purple', color: '#722ED1' },
    ];

    PageLoading

    一个简单的加载页面

    参数说明类型默认值
    (...)支持所有的 antd Spin 组件参数--

    getMenuData

    根据 router 信息来生成 menuData 和 breadcrumb。

    import { getMenuData } from '@ant-design/pro-components';
    
    const { breadcrumb, menuData } = getMenuData(
      routes,
      menu,
      formatMessage,
      menuDataRender,
    );
    参数说明类型默认值
    routes路由的配置信息route[]-
    menumenu 的配置项,默认 {locale: true}{ locale: boolean }-
    menuDataRendermenuData 的 render 方法,用来自定义 menuData(menuData: MenuDataItem[]) => MenuDataItem[]-
    formatMessagereact-intl 的 formatMessage 方法(data: { id: any; defaultMessage?: string }) => string;-

    getPageTitle

    getPageTitle 封装了根据 menuData 上生成的 title 的逻辑。

    import { getPageTitle } from '@ant-design/pro-components';
    
    const title = getPageTitle({
      pathname,
      breadcrumb,
      menu,
      title,
      formatMessage,
    });
    参数说明类型默认值
    pathname当前的 pathnamelocation.pathname-
    breadcrumbMenuDataItem 的合集{ [path: string]: MenuDataItem }-
    menumenu 的配置项,默认 {locale: true}{ locale: boolean }-
    titletitle 的类型string'Ant Design Pro'
    formatMessagereact-intl 的 formatMessage 方法(data: { id: any; defaultMessage?: string }) => string;-

    Settings

    // 可以通过 import { Settings } from '@ant-design/pro-layout/defaultSettings'
    // 来获取这个类型
    export interface Settings {
      /** theme of nav */
      navTheme: 'light' | 'realDark';
      /** Primary color of ant design */
      colorPrimary: string;
      /** Nav menu position: `side` or `top` or `mix` */
      layout: 'side' | 'top' | 'mix';
      /** Layout of content: `Fluid` or `Fixed`, only works when layout is top */
      contentWidth: 'Fluid' | 'Fixed';
      /** Sticky header */
      fixedHeader: boolean;
      /** Sticky siderbar */
      fixSiderbar: boolean;
      /**
       * menu 的配置
       * @example 取消自动关闭菜单 menu={{ autoClose: false }}
       */
      menu?: {
        locale?: boolean;
        hideMenuWhenCollapsed?: boolean;
        collapsedShowTitle?: boolean;
        collapsedShowGroupTitle?: boolean;
        defaultOpenAll?: boolean;
        ignoreFlatMenu?: boolean;
        loading?: boolean;
        onLoadingChange?: (loading?: boolean) => void;
        params?: Record<string, any>;
        request?: (
          params: Record<string, any>,
          defaultMenuData: MenuDataItem[],
        ) => Promise<MenuDataItem[]>;
        type?: 'sub' | 'group';
        autoClose?: false;
        collapsedWidth?: number;
      };
      /** Layout 的 title,也会显示在浏览器标签上 */
      title?: string | false;
      /** Your custom iconfont Symbol script Url */
      iconfontUrl?: string;
      /** 主色,需要配合 umi 使用 */
      colorPrimary?: string;
      /** 全局增加滤镜 */
      colorWeak?: boolean;
      /** 只在 mix 模式下生效,切割菜单 */
      splitMenus?: boolean;
      /** 在菜单为空时隐藏Sider */
      suppressSiderWhenMenuEmpty?: boolean;
      /** 侧边菜单模式 */
      siderMenuType?: 'sub' | 'group';
    }
    // 可以通过 import { MenuDataItem } from '@ant-design/pro-components'
    // 来获取这个类型
    export interface MenuDataItem {
      authority?: string[] | string;
      children?: MenuDataItem[];
      hideChildrenInMenu?: boolean;
      hideInMenu?: boolean;
      icon?: string;
      locale?: string;
      name?: string;
      path: string;
    
      [key: string]: any;
    }

    Route

    // 可以通过 import { RouterTypes } from '@ant-design/pro-layout/lib/typings';
    // 来获取这个类型
    export interface Route {
      path: string;
      children: Array<{
        exact?: boolean;
        emoji: string;
        name: string;
        path: string;
        // 可选二级菜单
        children?: Route['children'];
      }>;
    }

    页脚一般会展示一些公司和版权信息,默认的 ProLayout 不提供 Footer,但是提供了一个 DefaultFooter 组件,支持配置一些超链接和版权信息。

    import { GithubOutlined } from '@ant-design/icons';
    import { DefaultFooter } from '@ant-design/pro-components';
    
    <DefaultFooter
      copyright="@2019 蚂蚁金服体验技术部出品"
      links={[
        {
          key: 'Ant Design Pro',
          title: 'Ant Design Pro',
          href: 'https://pro.ant.design',
          blankTarget: true,
        },
        {
          key: 'github',
          title: <GithubOutlined />,
          href: 'https://github.com/ant-design/ant-design-pro',
          blankTarget: true,
        },
        {
          key: 'Ant Design',
          title: 'Ant Design',
          href: 'https://ant.design',
          blankTarget: true,
        },
      ]}
    />;

    GridContent

    GridContent 是个简单的语法糖,封装了 ProLayout 的 contentWidth 配置,contentWidth 如果设置为 Fixed 定宽模式,最宽只有 1200px。

    使用方式:

    <GridContent>{children}</GridContent>

    GridContent 封装了 等宽 和 流式 的逻辑。你可以在 preview 中查看预览效果。

    参数说明类型默认值
    contentWidth内容模式Fluid | Fixed-

    RouteContext

    RouteContext 可以提供 Layout 的内置的数据。例如 isMobile 和 collapsed,你可以消费这些数据来自定义一些行为。

    另外 RouteContext 也可以根据 layout 的数据来进行一些操作,PageContainer 和 FooterToolbar 都是依赖 RouteContext 的数据来实现功能。

    import { RouteContext, RouteContextType } from '@ant-design/pro-components';
    
    const Page = () => (
      <RouteContext.Consumer>
        {(value: RouteContextType) => {
          const { isMobile, hasHeader, hasSiderMenu, collapsed } = value;
          // 用户的标题
          return value.title;
        }}
      </RouteContext.Consumer>
    );

    Token

    Token 是一种设计系统的基本元素,可以使用 Token 来快速地修改组件库的基础样式。Layout 中可以通过 token 属性来配置这些颜色。

    Layout 的 token

    token说明默认值
    bgLayoutlayout 的背景颜色linear-gradient(${antdToken.colorBgContainer}, ${antdToken.colorBgLayout} 28%)
    colorTextAppListIcon跨站点应用的图标颜色#666
    colorTextAppListIconHover跨站点应用的图标 hover 颜色rgba(0, 0, 0, 0.65)
    colorBgAppListIconHover跨站点应用的图标 hover 背景颜色rgba(0, 0, 0, 0.04)

    Sider Token

    Sider Token 是侧边菜单的色值,与顶部菜单不同。

    token说明默认值
    colorMenuBackgroundmenu 的背景颜色transparent
    colorTextMenuTitlesider 的标题字体颜色colorTextHeading
    colorMenuItemDividermenuItem 分割线的颜色colorSplit
    colorTextMenumenuItem 的字体颜色colorText
    colorTextMenuSecondarymenu 的二级字体颜色,比如 footer 和 action 的 iconcolorText
    colorTextMenuSelectedmenuItem 的选中字体颜色rgb(0,0,0)
    colorTextMenuActivemenuItem hover 的选中字体颜色rgba(0, 0, 0, 0.85)
    colorTextMenuItemHovermenuItem 的 hover 字体颜色rgba(255,255,255,0.75)
    colorBgMenuItemActivemenuItem 的点击时背景颜色rgba(0, 0, 0, 0.15)
    colorBgMenuItemHovermenuItem 的 hover 背景颜色rgba(90, 75, 75, 0.03)
    colorBgMenuItemSelectedmenuItem 的选中背景颜色rgba(0, 0, 0, 0.04)
    colorBgMenuItemCollapsedElevated收起 menuItem 的弹出菜单背景颜色transparent
    colorBgCollapsedButton展开收起按钮背景颜色#fff
    colorTextCollapsedButton展开收起按钮字体颜色colorTextMenuSecondary
    colorTextCollapsedButtonHover展开收起按钮 hover 时字体颜色colorTextMenu

    Header Token

    token说明默认值
    colorBgHeaderheader 的背景颜色rgba(240, 242, 245, 0.4)
    colorHeaderTitlesider 的标题字体颜色colorTextHeading
    colorTextMenumenuItem 的字体颜色colorText
    colorTextMenuSecondarymenu 的二级字体颜色,比如 footer 和 action 的 iconcolorText
    colorTextMenuSelectedmenuItem 的选中字体颜色rgb(0,0,0)
    colorTextMenuActivemenuItem hover 的选中字体颜色rgba(0, 0, 0, 0.85)
    colorBgMenuItemHovermenuItem 的 hover 背景颜色rgba(90, 75, 75, 0.03)
    colorBgMenuItemSelectedmenuItem 的选中背景颜色rgba(0, 0, 0, 0.04)
    colorTextRightActionsItem右上角字体颜色colorTextSecondary
    colorBgRightActionsItemHover右上角选中的 hover 颜色rgba(0, 0, 0, 0.03)
    heightLayoutHeaderheader 高度56

    pageContainer Token

    token说明默认值
    paddingBlockPageContainerContentpageContainer 自带的 padding block24
    paddingInlinePageContainerContentpageContainer 自带的 padding inline40
    colorBgPageContainerpageContainer 的背景颜色transparent
    colorBgPageContainerFixedpageContainer 被固定时的背景颜色#FFF

    FAQ

    自定义布局

    ProLayout 提供了一些 api 来删除用户不需要的区域。在 SettingDrawer 中也提供了一些配置来进行设置。

    setting-drawer-render

    • headerRender 可以自定义顶栏
    • footerRender 可以自定义页脚
    • menuRender 可以自定义菜单区域
    • menuHeaderRender 自定义的菜单头区域
    • menuExtraRender 可以为菜单增加一个额外内容,在菜单头和菜单之间

    在 layout 中所有的 xxxRender 都可以传入 false,来关闭渲染。

    和 Umi 一起使用

    ProLayout 与 Umi 配合使用会有最好的效果,Umi 会把 config.ts 中的路由自动注入到配置的 layout 中,免去我们手写菜单的烦恼。

    ProLayout 扩展了 Umi 的 router 配置,新增了 name, icon, locale, hideInMenu, hideChildrenInMenu 等配置,这样可以更方便地生成菜单,在一个地方配置即可。数据格式如下:

    export interface MenuDataItem {
      /** @name 子菜单 */
      children?: MenuDataItem[];
      /** @name 在菜单中隐藏子节点 */
      hideChildrenInMenu?: boolean;
      /** @name 在菜单中隐藏自己和子节点 */
      hideInMenu?: boolean;
      /** @name 在面包屑中隐藏 */
      hideInBreadcrumb?: boolean;
      /** @name 菜单的icon */
      icon?: React.ReactNode;
      /** @name 自定义菜单的国际化 key */
      locale?: string | false;
      /** @name 菜单的名字 */
      name?: string;
      /** @name 用于标定选中的值,默认是 path */
      key?: string;
      /** @name disable 菜单选项 */
      disabled?: boolean;
      /** @name 路径,可以设定为网页链接 */
      path?: string;
      /**
       * @deprecated 当此节点被选中的时候也会选中 parentKeys 的节点
       * @name 自定义父节点
       */
      parentKeys?: string[];
      /** @name 隐藏自己,并且将子节点提升到与自己平级 */
      flatMenu?: boolean;
      /** @name 指定外链打开形式,同a标签 */
      target?: string;
    
      [key: string]: any;
    }

    ProLayout 会根据 location.pathname 来自动选中菜单,并且自动生成相应的面包屑。如果不想使用可以自己配置 selectedKeys 和 openKeys 来进行受控配置。

    收起展开

    有时候我们会发现 collapsed 和 onCollapse 设置默认收起并不生效,这是因为 ProLayout 中内置了 breakpoint 来触发收起的机制,我们可以设置 breakpoint={false} 来关掉这个机制。

    需要在任意组件中切换时,将 collapsed 提升到共享状态,并向 ProLayout 传入 collapsed={collapsed} 和 onCollapse={setCollapsed}。可复用的切换函数为 () => setCollapsed(value => !value)。

    自定义菜单的宽度

    siderWidth 可以自定义菜单的宽度,你可以将其设置得更短或者更长,FooterToolbar 等组件会自动支持,但是可能需要做一些样式上的处理,不然菜单展示可能会有一些小问题。

    菜单收起宽度是无法自定义的,因为涉及到动画和巨量的 CSS 改动,自定义难度很大。

    自动切割菜单

    自动切割菜单是 mix 模式专属的能力,他可以把第一级的菜单放置到顶栏中。我们可以设置 splitMenus=true 来打开它,为了良好体验,最好给每个一级菜单都设置一个重定向,这样可以防止切换到白屏页面。

    切割菜单

    自定义菜单

    ProLayout 会自动生成菜单,同时根据 pathname 进行自动选中。配合 PageContainer 可以实现自动推算面包屑和页面标题。如果和 Umi 配置使用,只需要将 Page 的 props 交给 ProLayout,ProLayout 会根据 config 中的 routers 的配置自动生成菜单。

    为了提供更多的功能,我们扩展了 routers 配置,增加了几个配置方便自定义,数据结构定义如下:

    // 可以通过 import { MenuDataItem } from '@ant-design/pro-components'
    // 来获取这个类型
    export interface MenuDataItem {
      children?: MenuDataItem[];
      hideChildrenInMenu?: boolean;
      hideInMenu?: boolean;
      icon?: string;
      locale?: string;
      name?: string;
      path: string;
      [key: string]: any;
    }
    • name 用于配置在菜单中的名称,同时会修改为浏览器标签页标题
    • icon 代表菜单的图标,只 antd 的图标,iconfont 需要自己定义
    • locale 可以设置菜单名称的国际化表示
    • hideInMenu 会把这个路由配置在 menu 中隐藏这个路由,name 不填会有相同的效果
    • hideChildrenInMenu 会把这个路由的子节点在 menu 中隐藏

    ProLayout 其实会读取 props 中的 route 和 location。这两个属性是 Umi 默认注入的。

    从服务器获取

    有些时候我们希望服务器来管理我们的路由,所以希望菜单是服务器进行分发的数据。我们提供了 menuDataRender 来进行修改数据,但是要注意 menuDataRender 会触发重新渲染,并且还会支持的国际化和权限的配置,如果你不需要国际化,建议使用 postMenuData,可以显著的提升性能。

    服务器需要返回的数据与 MenuDataItem 相同,menuDataRender 需要返回一个数组,如果你想拥有更好的性能可以试试使用 props 中的 route 属性,这里有个 demo。