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

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

前言

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

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

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


基礎環境

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


效果圖

  • antd風格

  • antd風格


原始碼及實現

暴露的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,

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

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