页面级别的组件,集成到布局中,也可以做成一个应用级别的组件,包含
- 页面标题
- 面包屑导航
- 页面通用操作
PageHeader 作为页面级别的组件,每个页面可以单独引用,然后传入数据
<BasicLayout>
<AppHeader title="Page A" />
// code
</BasicLayout>
应用级组件
PageHeader 作为应用级别的组件,数据要从 routerConfig里面获取,直接集成到布局中
- 纯展示型组件
- 一旦接收到的 props 发生变化,PageHeader组件就需要进行一次重绘
<BasicLayout />
从应用数据流的角度来
- 应用页眉应该是向不同的页面去传递数据的,而不是反过来去接收来自页面的数据
- PageHead组件与页面路由之间是有着严格的一一对应的关系
- 优化:将 PageHeader的配置,做到路由配置中,从 routerConfig里面渲染
- 对所有的应用级配置项,做统一的配置处理
应用级的 GlobalHeader + PageHeader
PageHeader
import Breadcrumbs from './Breadcrumbs';
function PageHeader(props) {
const { route: { title }, intl } = props;
if (!title) {
return null;
}
const pageTitle = intl.formatMessage({ id: pageTitle });
return (
<section className="page-header">
<h1 className="page-title">{pageTitle}</h1>
<Breadcrumbs />
</section>
);
}
routes
根据当前页面的 pathname,
使用 react-router-config 提供的 matchRoutes 方法,来获取当前页面 route 对象的所有配置项
import { matchRoutes } from 'react-router-config';
const routes = [
{
path: '/outlets',
exact: true,
permissions: ['admin', 'user'],
component: Outlets,
unauthorized: Unauthorized,
title: '门店管理',
breadcrumb: [
// name 多语言的 key
{path: '/outlets', name: 'outlets'}
],
},
{
path: '/outlets/:id',
exact: true,
permissions: ['admin', 'user'],
component: OutletDetail,
unauthorized: Unauthorized,
title: '门店详情',
breadcrumb: [
{path: '/outlets', name: 'outlets', title: '门店管理'},
{path: '/outlets/:id', name: 'outletsDetail', title: '门店详情'}
],
}
];
// matchRoutes(routes, pathname),返回一个路由对象
{
path: '/outlets/:id',
exact: true,
permissions: ['admin', 'user'],
component: OutletDetail,
unauthorized: Unauthorized,
title: '门店详情',
breadcrumb: [
{path: '/outlets', name: 'outlets', title: '门店管理'},
{path: '/outlets/:id', name: 'outletsDetail', title: '门店详情'}
],
}