前言
沒有什麼技術難度,只是比官方的文件多了一丟丟的判斷和改造;
用了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
,
解決就是我程式碼那樣先快取成元件,直接返回一個元件
有不對之處請留言,會及時修正,謝謝閱讀..