」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 React Router v6 在 React 中實作麵包屑

使用 React Router v6 在 React 中實作麵包屑

發佈於2024-11-06
瀏覽:605

Implementing Breadcrumbs in React using React Router v6

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

在本指南中,我们将使用 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.

的属性

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

export 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;

接下来,我们过滤掉所有与当前路由匹配的路由:
路线.过滤器((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';
    
    export 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 routes = [{ path: '/members/:id' }];
    
      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,这篇文章的灵感来自于此。

    版本聲明 本文轉載於:https://dev.to/bayo99/implementing-breadcrumbs-in-react-using-react-router-v6-363o?1如有侵犯,請聯絡[email protected]刪除
    最新教學 更多>
    • JavaScript 是同步還是異步,是單執行緒還是多執行緒? JavaScript程式碼是如何執行的?
      JavaScript 是同步還是異步,是單執行緒還是多執行緒? JavaScript程式碼是如何執行的?
      JavaScript 是一種同步、單執行緒語言,一次只能執行一個指令。僅噹噹前行執行完畢後,才會移至下一行。但是,JavaScript 可以使用事件循環、Promises、Async/Await 和回呼佇列執行非同步操作(JavaScript 預設是同步的)。 JavaScript程式碼是如何執行...
      程式設計 發佈於2024-11-06
    • 如何從 PHP 中的物件數組中提取一列屬性?
      如何從 PHP 中的物件數組中提取一列屬性?
      PHP:從物件數組中高效提取一列屬性許多程式設計場景都涉及使用物件數組,其中每個物件可能有多個屬性。有時,需要從每個物件中提取特定屬性以形成單獨的陣列。在 PHP 中,在不借助循環或外部函數的情況下用一行程式碼實現此目標可能很棘手。 一個可能的方法是利用 array_walk() 函數和 creat...
      程式設計 發佈於2024-11-06
    • 建構 PHP Web 專案的最佳實踐
      建構 PHP Web 專案的最佳實踐
      規劃新的 PHP Web 專案時,考慮技術和策略方面以確保成功非常重要。以下是一些規則來引導您完成整個過程: 1. 定義明確的目標和要求 為什麼重要:清楚了解專案目標有助於避免範圍蔓延並與利害關係人設定期望。 行動: 建立具有特定功能的專案大綱。 確定核心特徵和潛在的發展階段。 ...
      程式設計 發佈於2024-11-06
    • 如何在不使用巢狀查詢的情況下從 MySQL 中的查詢結果指派使用者變數?
      如何在不使用巢狀查詢的情況下從 MySQL 中的查詢結果指派使用者變數?
      MySQL 中根據查詢結果分配使用者變數背景和目標根據查詢結果分配使用者定義的變數可以增強資料庫操作能力。本文探討了在 MySQL 中實現此目的的方法,而無需借助嵌套查詢。 使用者變數賦值語法與流行的看法相反,使用者變數賦值可以直接整合到查詢中。 SET 語句的賦值運算子是= 或:=。但是,:= 必...
      程式設計 發佈於2024-11-06
    • 如何使用 array_column() 函數從 PHP 中的物件陣列中提取 Cat ID?
      如何使用 array_column() 函數從 PHP 中的物件陣列中提取 Cat ID?
      從PHP 中的物件陣列中提取貓ID處理物件陣列(例如貓物件陣列)時,提取特定屬性通常可以成為必要的任務。在這種特殊情況下,我們的目標是將每個 cat 物件的 id 屬性提取到一個新數組中。 正如您的問題中所建議的,一種方法涉及使用 array_walk() 和 create_function 。雖然...
      程式設計 發佈於2024-11-06
    • 實用指南 - 遷移到 Next.js App Router
      實用指南 - 遷移到 Next.js App Router
      隨著 Next.js App Router 的發布,許多開發者都渴望遷移他們現有的專案。在這篇文章中,我將分享我將專案遷移到 Next.js App Router 的經驗,包括主要挑戰、變更以及如何使流程更加順利。 這是一種增量方法,您可以同時使用頁面路由器和應用程式路由器。 為...
      程式設計 發佈於2024-11-06
    • 何時以及為何應調整 @Transactional 中的預設隔離和傳播參數?
      何時以及為何應調整 @Transactional 中的預設隔離和傳播參數?
      @Transactional中的隔離和傳播參數在Spring的@Transactional註解中,兩個關鍵參數定義了資料庫事務的行為:隔離和傳播。本文探討了何時以及為何應考慮調整其預設值。 傳播傳播定義了事務如何相互關聯。常見選項包括:REQUIRED: 在現有交易中執行程式碼,如果不存在則建立一個...
      程式設計 發佈於2024-11-06
    • OpenAPI 修剪器 Python 工具
      OpenAPI 修剪器 Python 工具
      使用 OpenAPI Trimmer 簡化您的 OpenAPI 文件 管理大型 OpenAPI 檔案可能會很麻煩,尤其是當您只需要一小部分 API 來執行特定任務時。這就是 OpenAPI Trimmer 派上用場的地方。它是一個輕量級工具,旨在精簡您的 OpenAPI 文件,使其...
      程式設計 發佈於2024-11-06
    • PHP:揭示動態網站背後的秘密
      PHP:揭示動態網站背後的秘密
      PHP(超文本預處理器)是一種伺服器端程式語言,廣泛用於建立動態和互動式網站。它以其簡單語法、動態內容生成能力、伺服器端處理和快速開發能力而著稱,並受到大多數網站託管服務商的支援。 PHP:揭秘動態網站背後的秘方PHP(超文本預處理器)是伺服器端程式語言,以其用於創建動態和互動式網站而聞名。它廣泛應...
      程式設計 發佈於2024-11-06
    • JavaScript 中的變數命名最佳實踐,實現簡潔、可維護的程式碼
      JavaScript 中的變數命名最佳實踐,實現簡潔、可維護的程式碼
      簡介:增強程式碼清晰度和維護 編寫乾淨、易於理解和可維護的程式碼對於任何 JavaScript 開發人員來說都是至關重要的。實現這一目標的一個關鍵方面是透過有效的變數命名。命名良好的變數不僅使您的程式碼更易於閱讀,而且更易於理解和維護。在本指南中,我們將探討如何選擇具有描述性且有意義的變數名稱,以顯...
      程式設計 發佈於2024-11-06
    • 揭示 Spring AOP 的內部運作原理
      揭示 Spring AOP 的內部運作原理
      在这篇文章中,我们将揭开 Spring 中面向方面编程(AOP)的内部机制的神秘面纱。重点将放在理解 AOP 如何实现日志记录等功能,这些功能通常被认为是一种“魔法”。通过浏览核心 Java 实现,我们将看到它是如何与 Java 的反射、代理模式和注释相关的,而不是任何真正神奇的东西。 ...
      程式設計 發佈於2024-11-06
    • JavaScript ESelease 筆記:釋放現代 JavaScript 的力量
      JavaScript ESelease 筆記:釋放現代 JavaScript 的力量
      JavaScript ES6,正式名稱為 ECMAScript 2015,引入了重大增強功能和新功能,改變了開發人員編寫 JavaScript 的方式。以下是定義 ES6 的前 20 個功能,它們使 JavaScript 程式設計變得更有效率和愉快。 JavaScript ES6 ...
      程式設計 發佈於2024-11-06
    • 了解 Javascript 中的 POST 請求
      了解 Javascript 中的 POST 請求
      function newPlayer(newForm) { fetch("http://localhost:3000/Players", { method: "POST", headers: { 'Content-Type': 'application...
      程式設計 發佈於2024-11-06
    • 如何使用 Savitzky-Golay 濾波平滑雜訊曲線?
      如何使用 Savitzky-Golay 濾波平滑雜訊曲線?
      雜訊資料的平滑曲線:探討Savitzky-Golay 濾波在分析資料集的過程中,平滑雜訊曲線的挑戰出現在提高清晰度並揭示潛在模式。對於此任務,特別有效的方法是 Savitzky-Golay 濾波器。 Savitzky-Golay 濾波器在資料可以透過多項式函數進行局部近似的假設下運作。它利用最小二乘...
      程式設計 發佈於2024-11-06
    • 重載可變參數方法
      重載可變參數方法
      重載可變參數方法 我們可以重載一個採用可變長度參數的方法。 此程式示範了兩種重載可變參數方法的方法: 1 各種可變參數類型:可以重載具有不同可變參數類型的方法,例如 vaTest(int...) 和 vaTest(boolean...)。 varargs 參數的類型決定了要呼叫哪個方法。 2 新...
      程式設計 發佈於2024-11-06

    免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

    Copyright© 2022 湘ICP备2022001581号-3