我想了解一下Ant设计,但是使用React Router的组件示例对我来说并不适用。
我需要你的帮助..。
发布于 2020-11-30 19:31:19
如果你正在使用Next.js路由系统,我建议你看看nextjs-breadcrumbs,它简单而有效。
或者,如果您更喜欢编写自己的组件,请使用它们的code作为参考。
import React, { useEffect, useState } from 'react';
import { useRouter } from 'next/router';
import Link from 'next/link';
const convertBreadcrumb = string => {
return string
.replace(/-/g, ' ')
.replace(/oe/g, 'ö')
.replace(/ae/g, 'ä')
.replace(/ue/g, 'ü')
.toUpperCase();
};
const Breadcrumbs = () => {
const router = useRouter();
const [breadcrumbs, setBreadcrumbs] = useState(null);
useEffect(() => {
if (router) {
const linkPath = router.asPath.split('/');
linkPath.shift();
const pathArray = linkPath.map((path, i) => {
return { breadcrumb: path, href: '/' + linkPath.slice(0, i + 1).join('/') };
});
setBreadcrumbs(pathArray);
}
}, [router]);
if (!breadcrumbs) {
return null;
}
return (
<nav aria-label="breadcrumbs">
<ol className="breadcrumb">
<li>
<a href="/">HOME</a>
</li>
{breadcrumbs.map((breadcrumb, i) => {
return (
<li key={breadcrumb.href}>
<Link href={breadcrumb.href}>
<a>
{convertBreadcrumb(breadcrumb.breadcrumb)}
</a>
</Link>
</li>
);
})}
</ol>
</nav>
);
};
export default Breadcrumbs;发布于 2021-05-31 09:36:47
这是我在nextjs中处理面包屑的方法,它使用router.asPath来获取指向面包屑的链接,并使用router.route来获取标签(如果它存在于Route2LabelMap中)。
pages/example.jsx
export default function Page() {
return <>
<BreadCrumbs />
<h1>My Page</h1>
</>
}components/BreadCrumbs.jsx
import Link from "next/link";
import { useRouter } from "next/router";
import React from "react";
/*
interface BreadCrumb {
route: string;
label: string;
link: string;
}
*/
const Route2LabelMap = {
"/": "Home",
"/profile/[username]/barrels": "Your Barrels",
"/barrels": "Barrel List",
"/barrels/[barrel_id]": "Barrel",
"/barrels/[barrel_id]/settings": "Settings",
};
export function BreadCrumbs() {
const router = useRouter();
const [crumbs, setCrumbs] = React.useState([]);
React.useEffect(() => {
const segmentsPath = router.asPath.split("/");
const segmentsRoute = router.route.split("/");
const crumbLinks = CombineAccumulatively(segmentsPath);
const crumbLabels = CombineAccumulatively(segmentsRoute);
const crumbs = crumbLinks.map((link, index) => {
const route = crumbLabels[index];
const crumb = {
link: link,
route: route,
label: Route2LabelMap[route] || route,
};
return crumb;
});
setCrumbs(crumbs);
console.log({
router,
segmentsPath,
segmentsRoute,
crumbLinks,
crumbLabels,
crumbs,
});
}, [router.route]);
return (
<div className="w-full flex gap-1">
{crumbs.map((c, i) => {
return (
<div className="flex items-center gap-1" key={i}>
{(i > 0) ? <div>{'>'}</div> : null}
<div className={(i == (crumbs.length - 1) ? 'bg-blue-300 ' : 'bg-gray-300 ') + " px-2 py-1 rounded-xl"}>
<Link href={c.link}>
<a>{c.label}</a>
</Link>
</div>
</div>
);
})}
</div>
);
}
function CombineAccumulatively(segments) {
/*
when segments = ['1','2','3']
returns ['1','1/2','1/2/3']
*/
const links = segments.reduce((acc, cur, curIndex) => {
const last = curIndex > 1 ? acc[curIndex - 1] : "";
const newPath = last + "/" + cur;
acc.push(newPath);
return acc;
}, []);
return links;
}渲染的BreadCrumbs
在本例中,要么显示路由,要么显示标签(如果标签存在于Route2LabelMap变量中),就像"Your Barrels“一样。

发布于 2021-08-25 18:06:09
我想过使用nextjs breadcrumbs,但我无法使其风格与antd (Ant Desing)保持一致。并希望使用antd提供的默认breadcrumb组件,因此,返回一些自己的简单组件,该组件使用next js路由器和一些js块。
const router = useRouter();
let routes= router.route.split('/');
let str='';
let hlinks=[];
routes.forEach((i,index,arr)=>{
if(i.charAt(0)=='[')
{
i=i.slice(1);
i=i.slice(0, i.length - 1);
console.log(i)
arr[index]=router.query[i];
}
str=str+arr[index]+'/';
hlinks.push(str);
});
console.log(hlinks);
console.log(routes);https://stackoverflow.com/questions/64541235
复制相似问题