使用 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 中实现面包屑的详细内容,更多请关注【创想鸟】其它相关文章!

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

    发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2667857.html

    (0)
    上一篇 2025年3月7日 12:24:04
    下一篇 2025年3月7日 12:24:11

    AD推荐 黄金广告位招租... 更多推荐

    相关推荐

    • 我的第一个 Hacktoberfest 贡献!!!

      黑客啤酒节 今天是 2024 年 10 月 1 日,标志着 Hacktoberfest 的开始。 Hacktoberfest 是为期一个月的开源项目、其维护者以及整个贡献者社区的庆祝活动。 我的第一个贡献 背景 由于 Hacktoberfe…

      2025年3月7日
      200
    • typescript在哪里学习

      可以在多种平台学习 TypeScript,包括在线平台(Codecademy、Udemy、Coursera)、书籍和文档(官方文档、《TypeScript 深入浅出》)、社区和论坛(Slack 群组、Stack Overflow、GitHu…

      2025年3月7日
      200
    • typescript用得多吗_typescript怎么使用

      TypeScript 正处于迅速增长阶段,在 2023 年 Stack Overflow 开发者调查中排名第四,其受欢迎度上升归因于类型检查、编辑器增强、代码重用、与 JavaScript 的互操作性,以及社区支持。使用 TypeScrip…

      2025年3月7日
      200
    • 如何隐藏地址栏 js

      使用 JavaScript 隐藏地址栏的步骤如下:设置 overflow 属性为 hidden,阻止页面滚动。使用 touchmove 和 preventDefault 事件,禁用触摸设备的滚动。(可选)添加 meta 标签以禁用移动设备的…

      2025年3月7日
      200
    • node.js如何学

      学习 Node.js 的入门步骤:熟悉 JavaScript 语言安装 Node.js创建 Node.js 文件并打印信息导入模块理解事件和回调进行 HTTP 请求进行数据库操作操作文件系统使用命令行界面部署和测试应用程序 如何学习 Nod…

      2025年3月7日
      200
    • js如何进阶

      进阶 JavaScript 技巧包括:熟练掌握基础知识;理解高级概念,如 OOP 和闭包;使用 ES6+ 语法和模块系统;通过实践和项目巩固理解;了解并使用框架和库;持续学习新知识;加入社区寻求帮助和分享知识;掌握调试和故障排除技巧;进行性…

      2025年3月7日
      200
    • 了解如何建立实时聊天

      在本教程中,我们将指导您使用 superviz 构建实时聊天应用程序。实时聊天是现代 web 应用程序的一项重要功能,它使用户能够即时相互通信。无论您是在构建协作平台、客户支持工具还是社交网站,添加实时聊天都可以增强用户交互和参与度。 我们…

      2025年3月7日
      200
    • Angular LAB:动画列表并使用 AnimationBuilder 实现命令式动画

      您知道 angular 包含一个复杂的动画系统吗?当我想要在元素进入屏幕或被破坏时为其设置动画时,我发现它特别有用! 此外,您还可以使用 animationbuilder 来强制播放、暂停或停止一些自定义动画!让我们看看它是如何完成的。 创…

      2025年3月7日
      200
    • 如何在Bootstrap中进行用户列表UI设计?

      用户列表是一种常见的界面元素,用于显示系统中的用户列表。在 bootstrap 中,您可以使用各种布局和样式选项来设计用户列表的外观。 如何使用 html 和 css 制作用户列表 在 bootstrap 中创建用户列表的一种方法是使用 和…

      2025年3月7日
      200
    • 快乐杜谢拉动画

      代码 Dussehra Animation body { margin: 0; padding: 0; background-color: #0d0d0d; color: white; font-family: ‘Arial’, sans-…

      2025年3月7日
      200

    发表回复

    登录后才能评论