页面级别的组件,集成到布局中,也可以做成一个应用级别的组件,包含

  • 页面标题
  • 面包屑导航
  • 页面通用操作

image.png
image.png
image.png

PageHeader 作为页面级别的组件,每个页面可以单独引用,然后传入数据

  1. <BasicLayout>
  2. <AppHeader title="Page A" />
  3. // code
  4. </BasicLayout>

应用级组件

PageHeader 作为应用级别的组件,数据要从 routerConfig里面获取,直接集成到布局中

  • 纯展示型组件
  • 一旦接收到的 props 发生变化,PageHeader组件就需要进行一次重绘
    1. <BasicLayout />

从应用数据流的角度来

  • 应用页眉应该是向不同的页面去传递数据的,而不是反过来去接收来自页面的数据
  • PageHead组件与页面路由之间是有着严格的一一对应的关系
  • 优化:将 PageHeader的配置,做到路由配置中,从 routerConfig里面渲染
  • 对所有的应用级配置项,做统一的配置处理

image.png
应用级的 GlobalHeader + PageHeader
1副本.jpg

PageHeader

  1. import Breadcrumbs from './Breadcrumbs';
  2. function PageHeader(props) {
  3. const { route: { title }, intl } = props;
  4. if (!title) {
  5. return null;
  6. }
  7. const pageTitle = intl.formatMessage({ id: pageTitle });
  8. return (
  9. <section className="page-header">
  10. <h1 className="page-title">{pageTitle}</h1>
  11. <Breadcrumbs />
  12. </section>
  13. );
  14. }

routes

根据当前页面的 pathname,
使用 react-router-config 提供的 matchRoutes 方法,来获取当前页面 route 对象的所有配置项

  1. import { matchRoutes } from 'react-router-config';
  2. const routes = [
  3. {
  4. path: '/outlets',
  5. exact: true,
  6. permissions: ['admin', 'user'],
  7. component: Outlets,
  8. unauthorized: Unauthorized,
  9. title: '门店管理',
  10. breadcrumb: [
  11. // name 多语言的 key
  12. {path: '/outlets', name: 'outlets'}
  13. ],
  14. },
  15. {
  16. path: '/outlets/:id',
  17. exact: true,
  18. permissions: ['admin', 'user'],
  19. component: OutletDetail,
  20. unauthorized: Unauthorized,
  21. title: '门店详情',
  22. breadcrumb: [
  23. {path: '/outlets', name: 'outlets', title: '门店管理'},
  24. {path: '/outlets/:id', name: 'outletsDetail', title: '门店详情'}
  25. ],
  26. }
  27. ];
  28. // matchRoutes(routes, pathname),返回一个路由对象
  29. {
  30. path: '/outlets/:id',
  31. exact: true,
  32. permissions: ['admin', 'user'],
  33. component: OutletDetail,
  34. unauthorized: Unauthorized,
  35. title: '门店详情',
  36. breadcrumb: [
  37. {path: '/outlets', name: 'outlets', title: '门店管理'},
  38. {path: '/outlets/:id', name: 'outletsDetail', title: '门店详情'}
  39. ],
  40. }