"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > تنفيذ مسارات التنقل في React باستخدام React Router v6

تنفيذ مسارات التنقل في React باستخدام React Router v6

تم النشر بتاريخ 2024-11-06
تصفح:239

Implementing Breadcrumbs in React using React Router v6

تعتبر مسارات التنقل مهمة في تطوير صفحات الويب لأنها توفر للمستخدمين طريقة لتتبع موقعهم الحالي داخل صفحة الويب الخاصة بنا وتساعد أيضًا في التنقل في صفحة الويب الخاصة بنا.

في هذا الدليل، سننفذ مسارات التنقل في React باستخدام جهاز التوجيه التفاعلي v6 وBootstrap.

React-router v6 عبارة عن مكتبة توجيه تُستخدم في React وReact Native للتنقل داخل صفحة ويب أو تطبيق ويب.

يستخدم تطبيقنا Typescript ولكن يمكن أيضًا استخدامه بسهولة لمشروع يعتمد على Javascript.

إنشاء

أولاً، لنثبت React-router-dom في مشروعنا إذا لم يكن قد تم تثبيته بالفعل:

تثبيت npm رد فعل جهاز التوجيه-دوم

أو البديل باستخدام الغزل:

يضيف الغزل رد فعل جهاز التوجيه

فلنقم أيضًا بتثبيت bootstrap لتصميم مكوناتنا:

تثبيت npm bootstrap

تنفيذ المكون لدينا

نقوم بعد ذلك بإنشاء مكون Breadcrumbs.tsx الذي سيحتوي على ترميز فتات الخبز ويتضمن أيضًا المنطق اللازم لتحديد الموقع الحالي بالنسبة إلى الموقع الجذر.

لنبدأ بإضافة علامة بسيطة للمكون:

 

يحتوي المكون حاليًا على زر الرجوع فقط. دعونا نضيف تطبيقًا بسيطًا لزر الرجوع بحيث يتم تحميل الصفحة السابقة عند النقر عليه:

  const goBack = () => {
    window.history.back();
  };

ستكون الخطوة التالية هي كتابة دالة تستخدم وظيفة matchRoutes للحصول على المسار الحالي وتطبيق التحويلات لتصفية جميع المسارات ذات الصلة بالمسار الحالي.
يقبل matchRoute مصفوفة من الكائنات من النوع AgnosticRouteObject ويقوم بإرجاع AgnosticRouteMatch[] | خالية حيث T هو نوع الكائن الذي نمرره.
من المهم أيضًا ملاحظة أن الكائن يجب أن يحتوي على خاصية تسمى المسار.

لنعلن أولاً عن واجهة لمسارنا:

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(routes, location);

نقوم بعد ذلك بإجراء فحص سريع لمعرفة ما إذا تم إرجاع أي نتيجة على الإطلاق ونأخذ النتيجة الأولى:
const matchedRoute = allRoutes ? allRoutes[0] : فارغة؛

بعد ذلك، نقوم بتصفية جميع المسارات التي تطابق المسار الحالي:
ways.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 في المسارات وتم تمرير المعرف كـ 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/geneating-an-automatic-breadcrumb-in-react-router-fed01af1fc3 الذي يستلهم منه هذا المنشور.

    بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/bayo99/implementing-breadcrumbs-in-react-using-react-router-v6-363o?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] للحذف هو - هي
    أحدث البرنامج التعليمي أكثر>

    تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

    Copyright© 2022 湘ICP备2022001581号-3