Làm cách nào để tạo đường dẫn v4 phản ứng-bộ định tuyến? Tôi đã thử hỏi câu hỏi này trên trang web phản ứng-router V4 thông qua một vé phát hành. Họ chỉ nói để xem ví dụ recursive paths. Tôi thực sự muốn tạo nó trong semantic-ui-reactLàm cách nào để tạo đường dẫn v4 phản ứng-bộ định tuyến?
Trả lời
Tôi đã làm điều tương tự và câu hỏi của bạn đã chỉ cho tôi đúng hướng.
này đã làm việc cho tôi:
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>
)
tôi đã sử dụng semantic-ui-react
cho dự án của riêng tôi và đã làm điều này để tạo đường dẫn dựa trên 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}/>;
};
Vấn đề với cả hai phương pháp này là bạn bị giới hạn sử dụng tên đường dẫn trong đường dẫn; có nghĩa là, bạn phải buộc định tuyến của mình vào tên bản trình bày của đường nhỏ.
Hãy thử giải pháp này rất đơn giản:
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 của bạn:
.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; }
Sau đó sử dụng nó như thế này:
<div className="container-fluid breadcrumbs">
<Route path='/:path' component={Breadcrumbs} />
</div>
Chúc mừng mã hóa!
Điều này có thể được thực hiện bằng cách sử dụng HOC phân tích cú pháp pathname
từ bộ phản ứng-bộ định tuyến và trả về kết quả khớp với nó. Trong khi một chút chi tiết hơn, tôi nghĩ rằng nó cung cấp cho sự linh hoạt lớn hơn và một mảng đối tượng cấu hình breadcrumb dễ đọc.
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,
})
}
/>
));
nguồn mở HOC cũng có sẵn ở đây: https://github.com/icd2k3/react-router-breadcrumbs-hoc
Từ react-router
doc: các <Route>
componens được render một số linh kiện của bạn khi một vị trí khớp với đường dẫn của tuyến đường như điều này:
<Route path={`${match.url}/:topicId`} component={Topic}/>
Trách nhiệm cơ bản đối với thông tin có sẵn cho thành phần kết hợp là <Topic>
trong trường hợp này. Nó biết làm thế nào để lấy dữ liệu hoặc nó đã được gắn với trạng thái redux và vân vân. Vì vậy, <Topic>
đơn giản hóa bột bánh mì đại lý mục và chuyển dữ liệu cần thiết cho nó như sau:
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>
)
Đó là tất cả. Ví dụ đầy đủ hơn trong this answer. Sống ở đây demo.
- 1. React Router v4 - Cách nhận tuyến đường hiện tại?
- 2. Tiền tố định tuyến OData v4?
- 3. Làm thế nào để đặt đường dẫn mặc định (tiền tố tuyến đường) trong express?
- 4. React Router v4 hiển thị nhiều tuyến đường
- 5. Cách nhận thông số truy vấn trong phản ứng-bộ định tuyến v4
- 6. Bộ định tuyến phản ứng: Không thể đọc thuộc tính 'tên đường dẫn' không xác định
- 7. Định tuyến đường dẫn trong Flask
- 8. Devise không tạo đường dẫn/tuyến đường đăng ký
- 9. Làm cách nào để lấy dữ liệu tuyến đường ggmap để đi theo đường dẫn
- 10. Tuyến đường mặc định cho đường dẫn gốc sử dụng thuộc tính asp.net định tuyến
- 11. bộ định tuyến phản ứng có được tên đường dẫn hiện tại đầy đủ
- 12. Làm thế nào để biết đường dẫn gắn kết của bộ định tuyến trên express?
- 13. Làm cách nào để tạo một đường dẫn ngẫu nhiên?
- 14. Làm cách nào để phản hồi bộ định tuyến phản hồi với mã trạng thái 404?
- 15. chuyển hướng từ hành động redux trong bộ định tuyến phản ứng v4
- 16. Phản hồi ủy quyền cơ sở vai trò bộ định tuyến v4
- 17. Định tuyến Asp.Net: Làm cách nào để bỏ qua nhiều tuyến đường ký tự đại diện?
- 18. Cách gửi các hành động về thay đổi vị trí với bộ định tuyến phản ứng v4
- 19. Làm cách nào để mọi người xử lý khôi phục cuộn bằng bộ phản ứng-v4?
- 20. phản ứng-bộ định tuyến - tạo các tuyến đường lồng nhau không có thành phần làm tổ
- 21. Xác định nhiều tuyến đường Express.js bằng cách sử dụng thông số đường dẫn
- 22. ray 3: Cách tạo đường dẫn?
- 23. Làm thế nào để làm cho ASP.NET định tuyến thoát khỏi giá trị tuyến đường?
- 24. phản ứng-bộ định tuyến không chờ đợi hoạt ảnh trước khi thay đổi tuyến đường
- 25. Làm cách nào để lấy tên tuyến đường trong trình xử lý bằng cách sử dụng đường phản ứng?
- 26. Định tuyến đường ray: Cung cấp giá trị mặc định cho người trợ giúp đường dẫn
- 27. Định tuyến Ember.js: làm cách nào để bạn đặt tuyến đường mặc định để hiển thị ngay lập tức?
- 28. Cách xác định đường dẫn tùy chỉnh trong đường ray?
- 29. Cách loại trừ hoặc bỏ qua các đường dẫn hoặc tuyến đường đặc biệt từ định tuyến zuul
- 30. Làm cách nào để xác định trình trợ giúp định tuyến riêng trong đường ray 3?
Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/17819984) –
Đủ công bằng @JagjotSingh! Tôi đã chỉnh sửa câu trả lời của mình để bao gồm tất cả các mã nguồn có liên quan. –
Làm tốt công việc chỉnh sửa bạn đời trả lời này! –