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

使用 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 组件,它将包含面包屑的标记,还包括确定相对于根位置的当前位置的必要逻辑。

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

 

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

  const goback = () => {    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([]);

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

const getpaths = () => {  const allroutes = matchroutes(routes, location);  const matchedroute = allroutes ? allroutes[0] : null;  let breadcrumbs: iroute[] = [];  if (matchedroute) {    breadcrumbs = routes      .filter((x) => matchedroute.route.path.includes(x.path))      .map(({ path, ...rest }) => ({        path: object.keys(matchedroute.params).length          ? object.keys(matchedroute.params).reduce(              (path, param) => 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 }) => ({          path: object.keys(matchedroute.params).length            ? object.keys(matchedroute.params).reduce(                (path, param) => path.replace(`:${param}`, matchedroute.params[param] as string),                path              )            : path,          ...rest,        }));

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

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

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

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

{crumbs.map((x: iroute, key: number) =>  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 = () => {  const location = useLocation();  const [crumbs, setCrumbs] = useState([]);  const getPaths = () => {    const allRoutes = matchRoutes(routes, location);    const matchedRoute = allRoutes ? allRoutes[0] : null;    let breadcrumbs: IRoute[] = [];    if (matchedRoute) {      breadcrumbs = routes        .filter((x) => matchedRoute.route.path.includes(x.path))        .map(({ path, ...rest }) => ({          path: Object.keys(matchedRoute.params).length            ? Object.keys(matchedRoute.params).reduce(                (path, param) => path.replace(`:${param}`, matchedRoute.params[param] as string),                path              )            : path,          ...rest,        }));    }    setCrumbs(breadcrumbs);  };  useEffect(() => {    getPaths();  }, [location]);  const goBack = () => {    window.history.back();  };  return (    
    );};export default Breadcrumbs;

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

    结论

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

    有用的链接

    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,这篇文章的灵感来自于此。

    以上就是使用 React Router v6 在 React 中实现面包屑的详细内容,更多请关注创想鸟其它相关文章!

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
    发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1491918.html

    赞 (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    安全处理 JWT 身份验证:陷阱和最佳实践
    上一篇 2025年12月19日 14:22:38
    里氏替换原理(LSP)的缺点
    下一篇 2025年12月19日 14:22:52

    相关推荐

    • Java中整数类型溢出行为详解:二进制补码与循环特性

      Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性

      Java中原始整数类型在处理超出其范围的数值时,会遵循一种基于二进制补码的循环溢出机制。这意味着当正数溢出时会“回卷”为负数,反之亦然,如同数字在一个有限的圆环上循环。理解这一特性对于准确预测类型转换和算术运算结果至关重要。 计算机中的数值表示:位、字节与二进制 在计算机底层,所有数据都以二进制形式…

      2026年9月25日 • 用户投稿
      200
    • Java数据类型溢出:原理、预测与避免

      Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免

      本文旨在深入解析Java中数据类型溢出的现象,阐述其背后的二进制补码原理,并提供预测溢出结果的方法。通过理解数据在计算机中的存储方式,以及溢出时数值的循环特性,开发者可以更好地掌握Java中的数据类型,避免潜在的错误。 数据在计算机中的存储:二进制补码 计算机底层使用二进制(bits)来表示所有数据…

      2026年9月25日 • 用户投稿
      100
    • Ubuntu Kafka集群如何搭建

      在ubuntu上搭建kafka集群涉及多个步骤,包括安装和配置kafka以及zookeeper。以下是详细的步骤指南: 1. 安装Zookeeper集群 1.1 集群规划 在主机node1、node2和node3上部署Zookeeper。 1.2 解压安装 从Apache Zookeeper官网下载…

      2026年9月24日
      100
    • VSCode如何实现AI版本迁移辅助 VSCode跨版本升级的智能建议

      vscode的“ai版本迁移辅助”并非独立功能,而是通过扩展兼容性检查、设置同步、lsp/dap协议支持及社区资源等生态能力协同实现;2. 升级后扩展无法工作时,应检查更新日志、尝试降级或重新安装扩展、禁用冲突扩展、查看控制台错误信息并向作者报告问题;3. 备份设置和扩展列表可通过启用设置同步、手动…

      2026年9月24日
      1100
    • 如何在Java中处理StackOverflowError

      StackOverflowError由无限递归或调用栈过深引发,属Error类型,需预防为主;2. 常见于递归无终止、循环调用或深度嵌套;3. 避免方法需设可达成的基准条件,如阶乘递归中n≤1时返回1。 Java中的StackOverflowError通常由无限递归或过深的调用栈引发,属于Error…

      2026年9月24日
      100
    • SpringBoot 配置 ELK 环境

      SpringBoot 配置 ELK 环境SpringBoot 配置 ELK 环境SpringBoot 配置 ELK 环境SpringBoot 配置 ELK 环境

      为什么要使用elk?简单来说,elk栈(elasticsearch、logstash、kibana)是一个强大的日志分析和管理工具组合,可以帮助我们高效地收集、存储、搜索和可视化日志数据。下面我将简单地介绍一下elk的架构,并详细说明如何在mac和linux系统上配置elk环境。windows系统的…

      2026年9月23日 • 用户投稿
      500
    • 使用 Dompdf 高效生成大量 PDF:优化长时任务与超时处理

      本文探讨了在使用 Dompdf 生成大量或多页 PDF 文件时遇到的超时问题。针对Web环境下的限制,文章提出了两种解决方案:短期内可通过调整PHP执行时间限制来缓解,但更推荐采用PHP命令行接口(CLI)进行后台处理。通过将耗时任务转移到独立的CLI脚本中执行,可以有效避免Web服务器超时,提升P…

      2026年9月23日
      200
    • VSCode快速配置React:JSX支持、中文文档、组件调试

      首先确保安装es7 react/redux/graphql/react-native snippets扩展并配置jsconfig.json文件以启用jsx语法高亮;通过安装中文语言包汉化界面,并结合浏览器书签、翻译工具及笔记软件高效查阅react中文文档;调试react组件时需安装debugger …

      2026年9月23日
      200
    • 解决WordPress插件中$wpdb对象未初始化导致的数据库更新失败问题

      本文旨在解决wordpress插件开发中,使用`$wpdb`对象进行数据库更新时出现`call to a member function query() on null`错误。该错误通常是由于`$wpdb`对象未正确初始化所致。教程将详细解释错误原因,并提供通过引入`wp-config.php`文件…

      2026年9月23日
      200
    • Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1

      Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1

      车票 面试题1:你遇到过哪些OOM情况,什么原因造成的?怎么解决的? 该问题主要针对你遇到的实际问题出发,可以根据你实际遇到过的情况和场景,结合下面每种情况的具体原因和解决方式,整理后回答。 当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMe…

      2026年9月23日 • 用户投稿
      100
    • 使用PHP和Ajax实现搜索结果的A-Z排序

      在PHP搜索结果页面实现A-Z排序功能,可以极大地提升用户体验。结合Ajax技术和PHP后端排序逻辑,我们可以在不刷新页面的情况下实现排序功能。以下将详细介绍实现步骤。 1. 前端:创建排序表单和Ajax请求 首先,需要在 search.php 页面中创建一个表单,用于触发排序操作。这个表单可以包含…

      2026年9月23日
      100
    • 定制Spring Boot Kafka自动配置:构建可复用的配置注解

      本文深入探讨了在Spring Boot应用中,如何通过自定义注解实现Kafka配置的自动化与简化。面对传统@PostConstruct方法注册KafkaTemplate导致Bean无法注入的问题,文章详细介绍了两种更健壮的解决方案:利用META-INF/spring.factories实现真正的自动…

      2026年9月22日
      200
    • VSCode快速配置Markdown:实时预览、中文排版、导出PDF

      答案:通过安装Markdown All in One和Markdown PDF扩展,并配置自定义CSS文件优化中文字体、行高及排版样式,可在VSCode中实现Markdown实时预览、中文排版优化和高质量PDF导出,结合settings.json设置可进一步支持页眉页脚、自动转换等功能,提升文档编写…

      2026年9月22日
      100
    • Spring Boot自定义Kafka配置与动态Bean注册最佳实践

      本文探讨了在Spring Boot应用中通过自定义注解简化Kafka配置的挑战与解决方案。重点介绍了如何利用META-INF/spring.factories实现早期自动配置,并详细阐述了使用ImportBeanDefinitionRegistrar在应用上下文初始化早期动态注册Kafka生产者工厂…

      2026年9月22日
      100
    • VSCode安装C/C++文档查看 提升开发效率的VSCode技巧

      答案是利用C/C++扩展和cppreference插件实现高效文档查阅。首先安装微软官方C/C++扩展,启用智能感知与悬停提示;再安装cppreference扩展,通过命令面板直接搜索标准库函数,实现离线在线无缝查阅;结合Doxygen生成项目文档,使用“转到定义”功能快速跳转源码;同时借助Inte…

      2026年9月22日
      200
    • 如何在mysql中搭建Percona XtraDB Cluster

      部署PXC需先配置系统环境并安装Percona源,随后在首个节点通过bootstrap启动集群,配置wsrep参数并创建SST用户,其他节点按相同配置加入集群,通过SHOW STATUS验证集群状态,确保cluster_size、wsrep_ready和cluster_status正常。 在MySQ…

      2026年9月22日
      100
    • 递归实现列表排序检查与条件移除最大值

      本文详细介绍了如何使用Java递归方法处理整数列表。核心内容包括:首先检查列表是否已排序,如果已排序则直接返回false;如果未排序,则查找列表中的最大值。仅当最大值位于列表的起始或结束位置时,才将其移除并递归地继续处理列表。如果最大值位于列表中间,则打印当前列表并终止递归。 在数据处理和算法设计中…

      2026年9月22日
      100
    • Ubuntu安装Python3.6并切换到3.6版本「建议收藏」

      大家好,很高兴再次与你们见面,我是你们的好朋友全栈君。 文章目录 前言==补充==1 了解系统中已安装的Python版本2 安装Python 3.63 从Python 2.7切换到Python 3.64 中间遇到的问题4.1 问题一4.2 问题二总结参考文献 前言本文记录我在Ubuntu 16.04…

      2026年9月21日
      100
    • 构建Spring自定义Kafka配置的注解式解决方案

      本文探讨了在Spring Boot应用中通过自定义注解实现Kafka配置自动化时遇到的挑战,特别是由于Bean注册时机不当导致的依赖注入失败。我们将深入分析问题根源,并提供两种核心解决方案:利用META-INF/spring.factories实现标准化的自动配置发现,以及通过ImportBeanD…

      2026年9月21日
      1200
    • 编译CEGUI「建议收藏」

      大家好,很高兴再次与你们见面,我是你们的老朋友全栈君。 平台: Windows 7 / 64位 / VS2005 CEGUI下载 地址:https://www.php.cn/link/9a2327a2fcc570914ce9c9e61581cbf8 源码选择: CEGUI 0.7.9 库源码下载 这…

      2026年9月21日
      100

    发表回复

    登录后才能评论
    关注微信