import React from 'react'; import pathToRegexp from 'path-to-regexp'; import Link from 'umi/link'; import { formatMessage } from 'umi-plugin-react/locale'; import { urlToList } from '../_utils/pathTools'; // 渲染Breadcrumb 子节点 // Render the Breadcrumb child node const itemRender = (route, params, routes, paths) => { const last = routes.indexOf(route) === routes.length - 1; return last || !route.component ? ( {route.breadcrumbName} ) : ( {route.breadcrumbName} ); }; const renderItemLocal = item => { if (item.locale) { return formatMessage({ id: item.locale, defaultMessage: item.name }); } return item.name; }; export const getBreadcrumb = (breadcrumbNameMap, url) => { let breadcrumb = breadcrumbNameMap[url]; if (!breadcrumb) { Object.keys(breadcrumbNameMap).forEach(item => { if (pathToRegexp(item).test(url)) { breadcrumb = breadcrumbNameMap[item]; } }); } return breadcrumb || {}; }; export const getBreadcrumbProps = props => { const { routes, params, location, breadcrumbNameMap } = props; return { routes, params, routerLocation: location, breadcrumbNameMap, }; }; // Generated according to props const conversionFromProps = props => { const { breadcrumbList } = props; return breadcrumbList.map(item => { const { title, href } = item; return { path: href, breadcrumbName: title, }; }); }; const conversionFromLocation = (routerLocation, breadcrumbNameMap, props) => { const { home } = props; // Convert the url to an array const pathSnippets = urlToList(routerLocation.pathname); // Loop data mosaic routing const extraBreadcrumbItems = pathSnippets .map(url => { const currentBreadcrumb = getBreadcrumb(breadcrumbNameMap, url); if (currentBreadcrumb.inherited) { return null; } const name = renderItemLocal(currentBreadcrumb); const { hideInBreadcrumb } = currentBreadcrumb; return name && !hideInBreadcrumb ? { path: url, breadcrumbName: name, } : null; }) .filter(item => item !== null); // Add home breadcrumbs to your head if defined if (home) { extraBreadcrumbItems.unshift({ path: '/', breadcrumbName: home, }); } return extraBreadcrumbItems; }; /** * 将参数转化为面包屑 * Convert parameters into breadcrumbs */ export const conversionBreadcrumbList = props => { const { breadcrumbList } = props; const { routes, params, routerLocation, breadcrumbNameMap } = getBreadcrumbProps(props); if (breadcrumbList && breadcrumbList.length) { return { routes: conversionFromProps(props), params, itemRender, }; } // 如果传入 routes 和 params 属性 // If pass routes and params attributes if (routes && params) { return { routes: routes.filter(route => route.breadcrumbName), params, itemRender, }; } // 根据 location 生成 面包屑 // Generate breadcrumbs based on location if (routerLocation && routerLocation.pathname) { return { routes: conversionFromLocation(routerLocation, breadcrumbNameMap, props), itemRender, }; } return {}; };