使用 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

    相关推荐

    • Python递归函数追踪与性能考量:以序列打印为例

      本文深入探讨了Python中一种递归打印序列元素的方法,并着重演示了如何通过引入缩进参数来有效追踪递归函数的执行流程和参数变化。通过实际代码示例,文章揭示了递归调用可能带来的潜在性能开销,特别是对调用栈空间的需求,以及Python默认递归深度限制可能导致的错误,为读者提供了理解和优化递归算法的实用见…

      2026年5月10日
      000
    • CSS技巧:在复杂悬停效果中确保图像始终可见

      CSS技巧:在复杂悬停效果中确保图像始终可见CSS技巧:在复杂悬停效果中确保图像始终可见CSS技巧:在复杂悬停效果中确保图像始终可见CSS技巧:在复杂悬停效果中确保图像始终可见

      本教程探讨如何在包含悬停效果的CSS卡片布局中,确保图像始终显示在最顶层而不被裁剪或遮挡。通过调整HTML结构,利用CSS的position和z-index属性,以及引入pointer-events,我们将解决图像被overflow: hidden和扩展叠加层遮盖的问题,实现复杂的视觉交互效果。 在…

      2026年5月10日 用户投稿
      000
    • python如何捕获所有类型的异常_python try except捕获所有异常的方法

      答案:捕获所有异常推荐使用except Exception as e,可捕获常规错误并记录日志,避免影响程序正常退出;需拦截系统信号时才用except BaseException as e。 在Python中,要捕获所有类型的异常,最常见且推荐的方法是使用 except Exception as e…

      2026年5月10日
      000
    • Bootstrap和MDB固定导航栏遮挡内容:如何优雅地解决页面跳转后内容被遮挡的问题?

      解决bootstrap和mdb固定导航栏遮挡内容的问题 使用Bootstrap和MDB框架构建网站时,固定导航栏遮挡内容是一个常见问题。尤其在页面跳转后,目标内容区域会被导航栏遮挡。本文提供一种优雅的解决方案,无需修改HTML结构,即可在页面跳转后自动调整滚动位置,避免内容被遮挡。 问题:点击导航链…

      2026年5月10日
      000
    • Angular mat-tab 高度自适应与布局优化指南

      本教程旨在解决Angular Material mat-tab组件在Flexbox布局中无法自动填充父容器高度的问题。文章将深入分析问题根源,并提供使用CSS深度选择器(::ng-deep)精确控制mat-tab-body-wrapper和mat-tab-body高度的解决方案,确保组件在指定布局下…

      2026年5月10日
      000
    • html自定义滚动条代码怎么写_html自定义滚动条代码编写指南

      html自定义滚动条代码怎么写_html自定义滚动条代码编写指南html自定义滚动条代码怎么写_html自定义滚动条代码编写指南html自定义滚动条代码怎么写_html自定义滚动条代码编写指南html自定义滚动条代码怎么写_html自定义滚动条代码编写指南

      自定义HTML滚动条可通过CSS的::-webkit-scrollbar伪元素实现,适用于Webkit内核浏览器;首先设置整体滚动条宽高,再定义轨道、滑块样式及悬停效果,可针对特定容器应用;为提升兼容性,Firefox可使用scrollbar-width和scrollbar-color属性适配,IE…

      2026年5月10日 用户投稿
      000
    • CSS Grid 实现表格列等宽布局

      本文旨在提供一种无需指定表格总宽度和各列宽度,即可实现表格列等宽布局的方案。通过利用 CSS Grid 布局的特性,可以使每列的宽度自动适应内容,并保持所有列的宽度一致,从而避免使用 JavaScript 动态计算和设置列宽,实现更简洁高效的布局方式。 在传统的 HTML 表格中,实现列等宽布局通常…

      2026年5月10日
      100
    • Flexbox布局中带标签文本域的重叠问题及解决方案

      本文探讨了在使用css flexbox布局和spectre.css框架时,为文本域添加标签可能导致内容重叠的问题。核心原因在于父容器固定高度与子元素`height: 100%`的冲突,导致文本域未能正确计算标签所占空间。解决方案是移除父容器的固定高度,并为文本域设置响应式的视口高度(`vh`)值,确…

      2026年5月10日
      300
    • 创建自动轮播图:JavaScript 实现指南

      创建自动轮播图:JavaScript 实现指南创建自动轮播图:JavaScript 实现指南创建自动轮播图:JavaScript 实现指南创建自动轮播图:JavaScript 实现指南

      本文旨在帮助开发者构建一个自动轮播图,解决手动切换和自动播放的问题。我们将提供完整的 HTML、CSS 和 JavaScript 代码示例,并详细解释实现原理,确保即使是 JavaScript 新手也能轻松掌握。重点在于理解 JavaScript 如何控制轮播图的自动切换和手动控制逻辑,以及如何优化…

      2026年5月10日 用户投稿
      000
    • PHP中基于用户角色的页面访问控制实践

      本教程详细讲解如何在PHP应用程序中利用会话(Session)机制实现基于用户角色的页面访问控制。通过正确的session_start()调用、用户登录时的角色信息存储,以及在受保护页面进行严格的会话和角色类型检查,确保只有特定用户(如“manager”)才能访问指定页面,从而有效防止未经授权的访问…

      2026年5月10日
      100
    • HTML文本排版常见问题有哪些_HTML文本排版常见问题如何快速排查与解决

      空白符处理不当导致格式丢失,可用标签或CSS的white-space属性解决;2. 段落间距不一致需重置margin并使用CSS Reset;3. 字体异常应检查font-family备选和@font-face加载;4. 文本溢出需设置word-wrap、text-overflow等控制换行与截断。…

      2026年5月10日
      000
    • 如何解决鼠标悬浮时背景图标被背景颜色遮挡的问题?

      巧妙解决鼠标悬停时图标被遮挡的问题 网站或应用中,鼠标悬停效果能提升用户体验。然而,有时悬停时背景图标会被新的背景颜色遮盖。本文通过案例分析,讲解如何解决此问题。 问题描述 一个搜索框,右侧图标在鼠标悬停时背景颜色改变,但图标却被新背景色遮挡: 相关CSS代码: .tx_mmenu_together…

      用户投稿 2026年5月10日
      000
    • 使用 CSS 实现图片悬停文字提示

      使用 CSS 实现图片悬停文字提示使用 CSS 实现图片悬停文字提示使用 CSS 实现图片悬停文字提示使用 CSS 实现图片悬停文字提示

      本教程详细介绍了如何使用 html 的 ` ` 和 “ 元素结合 css 实现图片悬停显示文本的交互效果。通过巧妙运用 css 动画和变换属性,当用户鼠标悬停在图片上时,图片会缩小、模糊,同时预设的文本内容平滑地淡入显示,从而提升用户界面的动态性和信息提示的友好性。 引言:图片悬停效果的重要性 在…

      2026年5月10日 用户投稿
      200
    • 行内块元素设置 overflow: hidden 后为什么会错位?

      行内块元素错位显示原因解析 在设置了 overflow: hidden 属性后,两个 inline-block 元素可能会出现错位显示。这是因为 overflow: hidden 影响了行内块元素的基线位置。 在行内块布局中,元素的基线与排版框的底部对齐。当一个行内块元素设置 overflow: h…

      2026年5月10日
      000
    • CSS中如何使用”…”结尾省略溢出内容?

      css如何处理溢出内容:使用”…”作为结尾 当文本内容超出了容器限制时,需要进行处理以保证内容的正确显示。css提供了多种方法来处理溢出内容,其中一种就是使用 “…” 作为结尾来进行文本省略。 针对给定的html代码,我们需要对…

      2026年5月10日
      000
    • PHP框架的社区支持存在哪些痛点?

      php框架社区支持的痛点包括:文档匮乏或过时(1)、响应缓慢(2)、社区分散(3)。实战案例表明这些痛点可能导致开发进度受阻。改善方法包括:提供全面的文档、建立响应迅速的官方论坛、创建一个集成的社区平台。 PHP 框架社区支持存在的痛点及实战案例 PHP 框架为 Web 开发提供了强大的基础,但其社…

      2026年5月10日
      100
    • menu和menuitem标签用法

      menu和menuitem标签虽在HTML5中被设计用于创建上下文菜单和工具栏,但因主流浏览器支持极差(仅Firefox部分支持),实际应用受限;现代开发普遍采用JavaScript结合ARIA属性(如role=”menu”、aria-haspopup等)构建可访问、可定制的…

      2026年5月10日
      000
    • 在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程

      在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程在点击图片时动态显示其替代文本(Alt Text)的JavaScript教程

      本教程详细介绍了如何利用JavaScript在用户点击缩略图时,动态地在大图下方显示其对应的替代文本(Alt Text)。通过修改现有函数,我们能够获取图像的alt属性,并将其内容插入到指定的HTML元素中,从而提升用户体验和信息传达效率。 引言 在网页开发中,图片是不可或缺的元素。为了提升用户体验…

      2026年5月10日 用户投稿
      000
    • HTML文本溢出DIV容器如何判断及处理?

      巧妙应对html文本溢出div容器 在HTML页面中,肉眼很难直接判断文本是否溢出了DIV容器。本文将介绍使用JavaScript和CSS两种方法来检测并处理这种情况,提升用户体验。 JavaScript检测方法 利用JavaScript的scrollHeight和offsetHeight属性,我们…

      2026年5月10日
      100
    • html如何固定_固定HTML元素位置使其不随滚动移动【滚动】

      要使HTML元素始终固定在视口指定位置,应使用position: fixed;若需滚动至阈值后固定则用position: sticky;兼容旧浏览器可用JavaScript动态设置top;响应式场景可结合媒体查询调整fixed方位;还需预留空间避免遮挡内容。 如果您希望HTML页面中的某个元素始终保…

      2026年5月10日
      000

    发表回复

    登录后才能评论
    关注微信