React 折騰記 - (9) 基於Antd+react-router-breadcrumbs-hoc封裝一個小巧的麵包屑元件

CRPER發表於2018-12-19

前言

沒有什麼技術難度,只是比官方的文件多了一丟丟的判斷和改造;

用了react-router-breadcrumbs-hoc,約定式和配置式路由路由皆可用,

只要傳入的符合規格的資料格式即可


基礎環境

React 16.4/UmiJS 2.2/Antd 3.x/ react-router-breadcrumbs-hoc 2.x: API簡潔易懂


效果圖

  • antd風格

React 折騰記 - (9) 基於Antd+react-router-breadcrumbs-hoc封裝一個小巧的麵包屑元件

  • antd風格

React 折騰記 - (9) 基於Antd+react-router-breadcrumbs-hoc封裝一個小巧的麵包屑元件


原始碼及實現

暴露的props:

  • data: 麵包屑的對映關係,陣列(react-router-breadcrumbs-hoc要求的那種)

比如 : const routes = [{ path: '/', breadcrumb: '首頁' }];

若是不傳遞的情況下,高階元件(react-router-breadcrumbs-hoc)會自動獲取路徑名字為麵包屑的名字

Breakcrumbs

import Link from 'umi/link';
import withBreadcrumbs from 'react-router-breadcrumbs-hoc';
import { Breadcrumb, Badge, Icon } from 'antd';

// 更多配置請移步 https://github.com/icd2k3/react-router-breadcrumbs-hoc
const routes = [{ path: '/', breadcrumb: '首頁' }];

const Breadcrumbs = ({ data }) => {
  if (data && Array.isArray(data)) {
    const AntdBreadcrumb = withBreadcrumbs(data)(({ breadcrumbs }) => {
      return (
        <Breadcrumb separator={<Icon type="double-right" />} classNames="spread">
          {breadcrumbs.map((breadcrumb, index) => (
            <Breadcrumb.Item key={breadcrumb.key}>
              {breadcrumbs.length - 1 === index ? (
                <Badge status="processing" text={breadcrumb} />
              ) : (
                <Link
                  to={{
                    pathname: breadcrumb.props.match.url,
                    state: breadcrumb.props.match.params ? breadcrumb.props.match.params : {},
                    query: breadcrumb.props.location.query ? breadcrumb.props.location.query : {},
                  }}
                >
                  {breadcrumb}
                </Link>
              )}
            </Breadcrumb.Item>
          ))}
        </Breadcrumb>
      );
    });
    return <AntdBreadcrumb />;
  }
  const DefaultBreadcrumb = withBreadcrumbs(routes)(({ breadcrumbs }) => (
    <div>
      {breadcrumbs.map((breadcrumb, index) => (
        <span key={breadcrumb.key}>
          <Link
            to={{
              pathname: breadcrumb.props.match.url,
              state: breadcrumb.props.match.params ? breadcrumb.props.match.params : {},
              query: breadcrumb.props.location.query ? breadcrumb.props.location.query : {},
            }}
          >
            {breadcrumb}
          </Link>
          {index < breadcrumbs.length - 1 && <i> / </i>}
        </span>
      ))}
    </div>
  ));
  return <DefaultBreadcrumb />;
};

export default Breadcrumbs;


複製程式碼

總結

若是直接返回高階元件,會丟擲異常說您返回的是函式而非React.child,

解決就是我程式碼那樣先快取成元件,直接返回一個元件

有不對之處請留言,會及時修正,謝謝閱讀..

相關文章