Я новичок в реагировании и пытаюсь создать хлебные крошки с динамическими идентификаторами между путем.
Мои реквизиты для компонента:
const breadcrumbsData = {
path: "facilities/65743/facilitycontact",
breadcrumbNameMap: {
"/facilities": "Facility",
"/facilities/:facilityId": ":facilityId",
"/facilities/:facilityId/facilitycontact": "Facility Contact"
}
};
код, который отображает хлебные крошки,
<Breadcrumbs arial-label = "Breadcrumb">
{paths.map((path, index) => {
const url = "/" + paths.slice(0, index + 1).join("/");
const last = index === paths.length - 1;
return last ? (
<Typography color = "inherit"> {breadcrumbNameMap[url]} </Typography>
) : (
<Link to = {url}>{breadcrumbNameMap[url]}</Link>
);
})}
</Breadcrumbs>
Я пробовал разные подходы, но не мог понять, как это сделать. Он отлично работает без идентификаторов между путями. Например
const breadcrumbsData = {
path: "facilities/facilityprofile/facilitycontact/workcontact",
breadcrumbNameMap: {
"/facilities": "Facility",
"/facilities/facilityprofile": "Facility Profile",
"/facilities/facilityprofile/facilitycontact": "Facility Contact"
}
};
P:S - Пробовал «сопоставить», но никуда не пошел с этим, и мой вариант использования - я вручную передаю путь из реквизита.
Вот полный код
Кодовая песочница — хлебные крошки с использованием пользовательского интерфейса реакции и материала





Я не совсем уверен, зачем вам это нужно, но вот специальное решение. Не используйте breadcrumbsData.breadcrumbNameMap напрямую, чтобы найти имя. Предварительно обработайте его и сгенерируйте карту с помощью простой замены строки.
Например, определите утилиту для предварительной обработки карты:
generateNameMap = (id, idKey, map) => {
// takes the actual id i.e. '65743',
// the template key that need to be replaced with i.e. ':facilityId'
// and the initial map i.e. breadcrumbsData.breadcrumbNameMap
const clone = {};
Object.keys(map).forEach(k => {
clone[k.replace(idKey, id)] = map[k].replace(idKey, id) // replace the template in both key and value with actual id
})
return clone;
}
Теперь определите свой breadcrumbNameMap, чтобы использовать эту утилиту, а не использовать breadcrumbsData.breadcrumbNameMap напрямую:
const breadcrumbNameMap = this.generateNameMap(paths[1], ':facilityId', breadcrumbsData.breadcrumbNameMap);
Вот демо:
const generateNameMap = (id, idKey, map) => {
const clone = {};
Object.keys(map).forEach(k => {
clone[k.replace(idKey, id)] = map[k].replace(idKey, id)
})
return clone;
}
const breadcrumbNameMap = generateNameMap('65743', ':facilityId', {
"/facilities": "Facility",
"/facilities/:facilityId": ":facilityId",
"/facilities/:facilityId/workcontact": "Facility Contact",
"/facilities/facilityprofile/facilitycontact/": "Work Contact"
});
console.info(breadcrumbNameMap);