使用 React Router v6 在 React 中实现面包屑

面包屑在网页开发中非常重要,因为它们为用户提供了一种跟踪其在网页中当前位置的方法,并有助于网页导航。

在本文中,我们将使用 react-router v6 和 bootstrap 在 react 中实现面包屑。

react-router v6 是 react 和 react native 中使用的路由库,用于在网页或 web 应用程序中导航。

我们的实现使用 typescript,但它也可以轻松用于基于 javascript 的项目。

设置

首先,如果尚未安装的话,让我们在我们的项目中安装react-router-dom:

npm 安装react-router-dom

或者替代方案,使用纱线:

纱线添加react-router-dom

让我们也安装 bootstrap 来设计我们的组件:

npm 安装引导

实现我们的组件

然后我们创建一个 breadcrumbs.tsx 组件,它将包含面包屑的标记,还包括确定相对于根位置的当前位置的必要逻辑。

让我们首先为组件添加一个简单的标记:

<div classname="text-primary"><nav aria-label="breadcrumb"><ol classname="breadcrumb">
<li classname="breadcrumb-item pointer"><span classname="bi bi-arrow-left-short me-1"></span>back</li></ol></nav>
</div>

该组件目前只有一个后退按钮。让我们为后退按钮添加一个简单的实现,这样当单击时,应该加载上一页:

const goback = () =&gt; {window.history.back();};

下一步将编写一个函数,该函数将使用 matchroutes 函数来获取当前路由并应用转换来过滤出与当前路由相关的所有路由。
matchroute 接受 agnosticrouteobject 类型的对象数组并返回 agnosticroutematch[] | null 其中 t 是我们传入的对象的类型。
另外需要注意的是,该对象必须包含名为 path 的属性。

让我们首先为我们的路线声明一个接口:

interface iroute {name: string;path: string; //important
}

然后让我们声明我们的路线:

const routes: iroute[] = [{path: '/home',name: 'home'},{path: '/home/about',name: 'about'},{path: '/users',name: 'users'},{path: '/users/:id',name: 'user'},{path: '/users/:id/settings/edit',name: 'edit user settings'}
];

我们还声明了一个变量来保存 uselocation 钩子,还声明了另一个变量来保存面包屑的状态:

const location = uselocation();
const [crumbs, setcrumbs] = usestate<iroute>([]);
</iroute>

接下来,让我们实现我们的功能:

const getpaths = () =&gt; {const allroutes = matchroutes(routes, location);const matchedroute = allroutes ? allroutes[0] : null;let breadcrumbs: iroute[] = [];if (matchedroute) {breadcrumbs = routes.filter((x) =&gt; matchedroute.route.path.includes(x.path)).map(({ path, ...rest }) =&gt; ({path: object.keys(matchedroute.params).length? object.keys(matchedroute.params).reduce((path, param) =&gt; path.replace(`:${param}`, matchedroute.params[param] as string), path): path,...rest,}));}setcrumbs(breadcrumbs);
};

在这里,我们首先获取与当前位置匹配的所有路线:
const allroutes = matchroutes(路线, 位置);

然后我们快速检查是否返回任何结果,并选择第一个:
常量匹配路由=所有路由? allroutes[0] : null;

接下来,我们过滤掉所有与当前路由匹配的路由:
routes.filter((x) =>matchedroute.route.path.includes(x.path))

然后让我们使用结果创建一个新数组,检查路径是否有参数,然后用参数值交换动态路由:

.map(({ path, ...rest }) =&gt; ({path: object.keys(matchedroute.params).length? object.keys(matchedroute.params).reduce((path, param) =&gt; path.replace(`:${param}`, matchedroute.params[param] as string),path): path,...rest,}));

这确保了如果我们在路由中将路由声明为 /users/:id/edit 并将 id 传递为 1,那么我们将得到 /users/1/edit。

接下来,让我们在 useeffect 中调用我们的函数,以便每次我们的位置发生变化时它都会运行:

useeffect(() =&gt; {getpaths();}, [location]);

完成此操作后,我们就可以在标记中使用面包屑:

{crumbs.map((x: iroute, key: number) =&gt;crumbs.length === key + 1 ? ({x.name}
) : (
{x.name}
) )} 

在这里,显示所有的面包屑及其链接,除了最后一个仅显示名称的面包屑。

这样,我们现在就有了完整的 breadcrumbs.tsx 组件:

import { useEffect, useState } from 'react';
import { Link, matchRoutes, useLocation } from 'react-router-dom';interface IRoute {name: string;path: string;
}const routes: IRoute[] = [{path: '/home',name: 'Home',},{path: '/home/about',name: 'About',},{path: '/users',name: 'Users',},{path: '/users/:id/edit',name: 'Edit Users by Id',},
];const Breadcrumbs = () =&gt; {const location = useLocation();const [crumbs, setCrumbs] = useState<iroute>([]);const getPaths = () =&gt; {const allRoutes = matchRoutes(routes, location);const matchedRoute = allRoutes ? allRoutes[0] : null;let breadcrumbs: IRoute[] = [];if (matchedRoute) {breadcrumbs = routes.filter((x) =&gt; matchedRoute.route.path.includes(x.path)).map(({ path, ...rest }) =&gt; ({path: Object.keys(matchedRoute.params).length? Object.keys(matchedRoute.params).reduce((path, param) =&gt; path.replace(`:${param}`, matchedRoute.params[param] as string),path): path,...rest,}));}setCrumbs(breadcrumbs);};useEffect(() =&gt; {getPaths();}, [location]);const goBack = () =&gt; {window.history.back();};return (<div classname=""><nav aria-label="breadcrumb"><ol classname="breadcrumb">
<li classname="breadcrumb-item pointer" onclick="{goBack}"><span classname="bi bi-arrow-left-short me-1"></span>Back</li>{crumbs.map((x: IRoute, key: number) =&gt;crumbs.length === key + 1 ? (<li classname="breadcrumb-item">{x.name}</li>) : (<li classname="breadcrumb-item"><link to="{x.path}" classname=" text-decoration-none">{x.name}</li>))}</ol></nav>
</div>);
};
export default Breadcrumbs;
</iroute>

然后我们可以在应用程序的任何部分使用该组件,最好是在布局中。

结论

我们已经了解了如何实现一个简单的面包屑组件,我们可以将其添加到我们的应用程序中以改进导航和用户体验。

有用的链接

https://stackoverflow.com/questions/66265608/react-router-v6-get-path-pattern-for-current-route

https://medium.com/@mattywilliams/generating-an-automatic-breadcrumb-in-react-router-fed01af1fc3,这篇文章的灵感来自于此。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550319.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

original多因子图绘制

成品参考 首先导入数据 设置过程 设置X轴 设置图 双击空白部分设置图层宽度&#xff08;也需要设置高度&#xff09; 颜色配置 1.删除边框 合适的参数与颜色&#xff08;设置为单色&#xff09;

【Python】Python多行输入储存为字典,值为列表

1.储存在变量中 # 输入格式&#xff1a;3 5 tabel, customer map(int, input().split()) print("table:", tabel) print("customer:", customer) 2.储存在列表中 #输入格式&#xff1a;2 4 2 tabel_number [int(x) for x in input().split()] print(&q…

跨国企业如何布局知识产权战略以应对国际条约的挑战与机遇?

在跨国企业的全球运营中&#xff0c;知识产权的战略布局显得尤为重要。面对复杂多变的国际环境&#xff0c;跨国企业如何在全球范围内有效保护其知识产权&#xff0c;同时利用国际条约促进合作并应对挑战&#xff0c;成为了一个亟待探讨的问题。 跨国企业知识产权的全球布局 1…

项目管理系统中的风险管理:如何识别和应对项目风险?

在现代项目管理中&#xff0c;风险管理是确保项目成功的关键因素之一。无论是技术、资源还是市场的变化&#xff0c;风险无处不在。有效的风险管理能够帮助团队识别潜在问题并制定应对策略&#xff0c;从而避免项目延误和预算超支。项目管理系统在这一过程中扮演着重要角色&…

微积分入门(真的很入门)

前置知识 前置知识&#xff1a;极限 我们要求 lim ⁡ x → 1 x 2 − 1 x − 1 \lim\limits_{x \to 1}\dfrac{x^2-1}{x-1} x→1lim​x−1x2−1​。 右边我们都知道是什么意思&#xff0c;那左边是什么呢&#xff1f; 意思就是&#xff0c;当 x x x 无限接近 1 1 1 时&…

相亲交友系统的社会影响:家庭结构的变化

随着互联网技术的发展&#xff0c;相亲交友系统已成为许多单身人士寻找伴侣的重要途径。这些平台不仅改变了人们的社交方式&#xff0c;还对家庭结构产生了深远的影响。本文将探讨相亲交友系统如何促使家庭结构发生变化&#xff0c;开发h17711347205并通过简单的Python代码示例…

华为OD机试 - 对称美学(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

kubernetes基础配置(入门操作)

资源管理 一、资源管理方式 1.命令式对象管理&#xff1a;直接使用命令去操作kubernetes资源 [rootmaster ~]# kubectl run nginx-pod --imagenginx --port80 kubectl run --generatordeployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubect…

煤矿厂智能化可视化:提升安全与效率

运用图扑可视化技术对煤矿厂进行实时监控与数据分析&#xff0c;提高安全管理水平和生产效率。

Java8/9/10/11新特性

目录 一、 Lambda表达式二、函数式(Functional)接口三、方法引用与构造器引用3.1、方法引用3.2 构造器引用和数组引用3.2.1 构造器引用3.2.2 数组引用 四、 强大的Stream API4.1 Stream API说明4.2 Stream 的操作三个步骤4.3 创建 Stream方式4.4 、Stream 的中间操作4.4.1 筛选…

VMware Tools安装——VMware Tools是灰色的,不能安装, (不带图形化界面的虚拟机,只有命令行的模式!!!)

问题 VMware Workstation 中“ 安装VMware Tools”是灰色的&#xff0c;无法点击安装 解决 1.挂载镜像文件 打开 VMware&#xff0c;点击虚拟机设置>>CD/DVD&#xff0c;选择“使用ISO映像文件”&#xff0c;点击“浏览” 再选择 VMware 安装目录中的 linux.iso 文件&a…

FPGA到底要怎么学?一篇文章直接让你搞清楚!!!

学好FPGA&#xff08;现场可编程门阵列&#xff09;涉及理论学习和实践操作的结合。以下是学习FPGA的基本流程和建议&#xff1a; 关注我&#xff0c;我会更新更多的知识&#xff0c;这会给你很多的帮助。 1. 理论基础 数字逻辑&#xff1a;了解基本的逻辑门、组合逻辑、时序…

JS对不同浏览器的检测问题

Navigator对象也称浏览器对象&#xff0c;该对象包含了浏览器的整体信息&#xff0c;如浏览器名称&#xff0c;版本号等。Navigator对象由Navigator浏览器率先使用&#xff0c;后来各方浏览器都开始支持Navigator对象&#xff0c;逐步成为一种标准。 一、Navigator对象的属性 …

HttpClientHandler 详解及使用

在现代网络编程中&#xff0c;HttpClientHandler 是一个至关重要的组件&#xff0c;它提供了对 HTTP 请求的底层配置和控制。本文将详细介绍 HttpClientHandler 的核心概念、配置选项以及如何在实际应用中使用它。 1. 什么是 HttpClientHandler&#xff1f; HttpClientHandle…

mongodb光速上手

开始 mongodb是一种nosql数据库&#xff0c;即非关系型数据库。 安装好后将bin目录添加到环境变量。 安装studio-3t&#xff0c;这是可视化编辑器。 启动 mongo --host localhost --port 27017 指令 查看所有库 show dbs 使用或创建并使用库 use school use 数据库名 向…

引入 LangChain4j 来简化 LLM 与 Java 应用程序的集成

作者&#xff1a;来自 Elastic David Pilato LangChain4j 框架于 2023 年创建&#xff0c;其目标如下&#xff1a; LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序的过程。 LangChain4j 提供了一种标准方法&#xff1a; 根据给定内容&#xff08;例如文本&#xff09;创…

【Lcode 随笔】C语言版看了不后悔系列持续更新中。。。

文章目录 题目一&#xff1a;爬楼梯问题描述&#xff1a;题目分析&#xff1a;解题思路&#xff1a;示例代码&#xff1a;深入剖析&#xff1a; 题目二&#xff1a;打家劫舍问题描述&#xff1a;题目分析&#xff1a;解题思路&#xff1a;示例代码&#xff1a;深入剖析&#xf…

什么是数字化转型?数字化转型对企业有哪些优势?

一、什么是数字化转型&#xff1f; 定义&#xff1a; 数字化转型是指企业或组织将传统业务转化为数字化业务&#xff0c;利用人工智能、大数据、云计算、区块链、5G等数字技术提升业务效率和质量的过程。通俗来说&#xff0c;就是将数字技术应用到企业的各个方面&#xff0c;…

【C语言软开面经】

C语言软开面经 malloc calloc realloc free动态分配内存malloccalloc函数&#xff1a;realloc 函数&#xff1a;free函数&#xff1a; 堆栈-内存分区栈区&#xff08;Stack&#xff09;&#xff1a;堆区&#xff08;Heap&#xff09;&#xff1a;全局&#xff08;静态&#xff…

windows下安装rabbitMQ并开通管理界面和允许远程访问

如题&#xff0c;在windows下安装一个rabbitMQ server&#xff1b;然后用浏览器访问其管理界面&#xff1b;由于rabbitMQ的默认账号guest默认只能本机访问&#xff0c;因此需要设置允许其他机器远程访问。这跟mysql的思路很像&#xff0c;默认只能本地访问&#xff0c;要远程访…