如何创建react-router v4 breadcrumbs?我试着通过问题票据在反应路由器V4网站上提出这个问题。他们只是说看到recursive paths的例子。我真的想在semantic-ui-react如何创建react-router v4面包屑?
6
A
回答
5
中创建它我是在相同的事情和你的问题指出我在正确的方向。
这为我工作:
const Breadcrumbs = (props) => (
<div className="breadcrumbs">
<ul className='container'>
<Route path='/:path' component={BreadcrumbsItem} />
</ul>
</div>
)
const BreadcrumbsItem = ({ ...rest, match }) => (
<span>
<li className={match.isExact ? 'breadcrumb-active' : undefined}>
<Link to={match.url || ''}>
{match.url}
</Link>
</li>
<Route path={`${match.url}/:path`} component={BreadcrumbsItem} />
</span>
)
4
我用semantic-ui-react
为我自己的项目,这样做是为了根据location.pathname
创建路径;
export default (props) => {
const paths = props.pathname.split('/').map((p, i, arr) => {
if (i === 0) return {
key: i,
content: (<Link to={'/'}>home</Link>),
active: (i === arr.length - 1),
link: (i < arr.length - 1)
};
if (i === arr.length - 1) return {
key: i,
content: p,
active: (i === arr.length - 1)
};
return {
key: i,
content: (<Link to={`${arr.slice(0, i + 1).join('/')}`}>{p}</Link>),
active: (i === arr.length - 1),
link: (i < arr.length - 1)}
};
);
return <Breadcrumb icon='chevron right' sections={paths}/>;
};
2
这两种方法的问题是,您仅限于在面包屑路径中使用路径名;也就是说,您必须将您的路由绑定到路径的演示文稿名称。
0
试试这个简单的解决方案:
const Breadcrumbs = ({ ...rest, match }) => (
<span>
<Link to={match.url || ''} className={match.isExact ? 'breadcrumb active' : 'breadcrumb'}>
{match.url.substr(match.url.lastIndexOf('/')+1, match.url.length)}
</Link>
<Route path={`${match.url}/:path`} component={Breadcrumbs} />
</span>
)
你的CSS:
.breadcrumbs {
background: #fff;
margin-bottom: 15px;
}
.breadcrumb {
margin-bottom: 0;
line-height: 2.5;
display: inline-block;
}
.breadcrumb::before {
display: inline-block;
padding-right: 5px;
padding-left: 5px;
color: #818a91;
content: "/"; }
.breadcrumb.active {
color: #818a91; }
然后使用它是这样的:
<div className="container-fluid breadcrumbs">
<Route path='/:path' component={Breadcrumbs} />
</div>
编码愉快!
2
这可以使用HOC来解析pathname
来自react-router并返回与它匹配的匹配。虽然稍微详细一点,但我认为它提供了更大的灵活性和一个可读的面包屑配置对象数组。
Breadcrumbs.jsx
import React from 'react';
import { NavLink } from 'react-router-dom';
import { withBreadcrumbs } from 'withBreadcrumbs';
const UserBreadcrumb = ({ match }) =>
<span>{match.params.userId}</span>; // use match param userId to fetch/display user name
const routes = [
{ path: 'users', breadcrumb: 'Users' },
{ path: 'users/:userId', breadcrumb: UserBreadcrumb},
{ path: 'something-else', breadcrumb: ':)' },
];
const Breadcrumbs = ({ breadcrumbs }) => (
<div>
{breadcrumbs.map(({ breadcrumb, path, match }) => (
<span key={path}>
<NavLink to={match.url}> // wrap breadcrumb with semantic-ui element
{breadcrumb}
</NavLink>
<span>/</span>
</span>
))}
</div>
);
export default withBreadcrumbs(routes)(Breadcrumbs);
withBreadcrumbs.js
import React from 'react';
import { matchPath, withRouter } from 'react-router';
const renderer = ({ breadcrumb, match }) => {
if (typeof breadcrumb === 'function') { return breadcrumb({ match }); }
return breadcrumb;
};
export const getBreadcrumbs = ({ routes, pathname }) => {
const matches = [];
pathname
.replace(/\/$/, '')
.split('/')
.reduce((previous, current) => {
const pathSection = `${previous}/${current}`;
let breadcrumbMatch;
routes.some(({ breadcrumb, path }) => {
const match = matchPath(pathSection, { exact: true, path });
if (match) {
breadcrumbMatch = {
breadcrumb: renderer({ breadcrumb, match }),
path,
match,
};
return true;
}
return false;
});
if (breadcrumbMatch) {
matches.push(breadcrumbMatch);
}
return pathSection;
});
return matches;
};
export const withBreadcrumbs = routes => Component => withRouter(props => (
<Component
{...props}
breadcrumbs={
getBreadcrumbs({
pathname: props.location.pathname,
routes,
})
}
/>
));
开源HOC也可以在这里找到: https://github.com/icd2k3/react-router-breadcrumbs-hoc
1
从react-router
DOC:在<Route>
componens被渲染你的一些部件时的位置与路线的路径相匹配这样的:
<Route path={`${match.url}/:topicId`} component={Topic}/>
基本责任的信息可用于渲染其及部件在这种情况下<Topic>
。它知道如何获取数据或者已经绑定了redux状态等等。所以<Topic>
简单的实例化breadcrums项目代理,并通过所需要的数据,以这样的:
import {BreadcrumbsItem} from 'react-breadcrumbs-dynamic'
const Topic = ({ match, topic }) => (
<div>
<h3>
{topic.title}
</h3>
<BreadcrumbsItem to={`${match.url}/${match.params.topicId}`}>
{topic.title}
</BreadcrumbsItem>
...
</div>
)
这就是全部。在this answer更全的例子。这里住demo。
相关问题
- 1. 创建“导航面包屑”
- 2. 为Moodle创建自定义面包屑
- 3. 用于创建与每个面包屑链接的面包屑的Javascript?
- 4. 面包屑。 ZF2
- 5. 如何面包屑菜单
- 6. 如何添加面包屑?
- 7. 如何实现面包屑?
- 8. 如何在Grails应用程序中创建面包屑?
- 9. 如何在树枝中创建动态的面包屑导航
- 10. 如何在Rails 3中创建动态生成的面包屑?
- 11. 如何在速度模板中创建面包屑
- 12. 如何使用asp.net中的菜单项创建面包屑?
- 13. 如何在此Apple站点中创建面包屑?
- 14. asp.net面包屑
- 15. Django CMS面包屑
- 16. asp.net面包屑
- 17. 面包屑Symfony的
- 18. 创建一个Sharepoint页面,但不显示在面包屑中
- 19. 角面包屑:包括下拉动态改变的面包屑
- 20. css来设计面包屑
- 21. 修复面包屑
- 22. 面包屑执行
- 23. 简单面包屑
- 24. 面包屑在OSClass
- 25. 面包屑导航
- 26. 显示面包屑
- 27. SilverStripe 3和面包屑
- 28. CakePHP面包屑配置
- 29. MVC3和面包屑导航
- 30. 如何在Eclipse中禁用面包屑
尽管此链接可能会回答问题,但最好在此处包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/17819984) –
够公平@JagjotSingh!我编辑了我的答案以包含所有相关的源代码。 –
编辑此答案队友的好工作! –