0Pricing
React Academy · درس

المسارات المتداخلة وتخطيطات Outlet

أنشئ تخطيطات لمسارات متعددة المستويات باستخدام المتداخل والمكوّن .

المسارات المتداخلة وتخطيطات Outlet درس مجاني في React Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

ما هي المسارات المتداخلة؟

تتيح المسارات المتداخلة في React Router v6 تركيب التخطيطات: إذ يعرض المسار الأب غلافًا، مثل شريط التنقل والشريط الجانبي، بينما تملأ المسارات الابنة منطقة المحتوى عبر <Outlet />.

تعريف المسارات المتداخلة

ضع عناصر <Route> الابنة داخل عنصر <Route> الأب في إعدادات الموجّه. ويكون مسار الأب بادئة لجميع المسارات الابنة.

import { createBrowserRouter, RouterProvider } from 'react-router-dom';

const router = createBrowserRouter([
  {
    path: '/',
    element: <RootLayout />,
    children: [
      { path: 'dashboard', element: <Dashboard /> },
      { path: 'settings', element: <Settings /> },
    ],
  },
]);

مكوّن Outlet

يمثّل <Outlet /> موضعًا مؤقتًا داخل مكوّن تخطيط الأب. يستبدله React Router بعنصر المسار الابن المطابق.

function RootLayout() {
  return (
    <div>
      <nav>
        <Link to="/dashboard">Dashboard</Link>
        <Link to="/settings">Settings</Link>
      </nav>
      <main>
        <Outlet /> {/* child route renders here */}
      </main>
    </div>
  );
}

مسارات الفهرس

يُعرض المسار الذي يحتوي على index: true عندما يطابق عنوان URL الخاص بالأب تطابقًا تامًا، ويعمل بوصفه الابن الافتراضي عند عدم تطابق أي مسار ابن آخر.

{
  path: '/',
  element: <RootLayout />,
  children: [
    { index: true, element: <Home /> }, // renders at '/'
    { path: 'about', element: <About /> },
  ],
}

التداخل متعدد المستويات

يمكن تداخل المسارات عبر مستويات متعددة. ويعرض كل مكوّن تخطيط في السلسلة عنصر <Outlet /> خاصًا بأبنائه.

const router = createBrowserRouter([
  {
    path: '/app',
    element: <AppShell />,
    children: [
      {
        path: 'users',
        element: <UsersLayout />,
        children: [
          { index: true, element: <UserList /> },
          { path: ':id', element: <UserDetail /> },
        ],
      },
    ],
  },
]);

سياق Outlet

مرّر البيانات من التخطيط إلى المسارات الابنة المتداخلة عبر الخاصية context في <Outlet />، واقرأها في الأبناء باستخدام useOutletContext().

// Parent layout
function UsersLayout() {
  const [selected, setSelected] = useState(null);
  return <Outlet context={{ selected, setSelected }} />;
}

// Child route
function UserDetail() {
  const { selected } = useOutletContext();
  return <div>{selected}</div>;
}

تخطيطات مسمّاة باستخدام المسارات بلا مسار

يغلّف المسار الذي لا يحتوي على path أبناءه لأغراض التخطيط فقط، من دون إضافة جزء إلى عنوان URL. ويفيد ذلك في تجميع المسارات ضمن تخطيط مشترك.

{
  element: <AuthenticatedLayout />, // no path
  children: [
    { path: '/profile', element: <Profile /> },
    { path: '/billing', element: <Billing /> },
  ],
}

الروابط النسبية في المسارات المتداخلة

داخل المسار المتداخل، يُحل <Link to='sibling'> بالنسبة إلى مسار المسار الحالي، تمامًا مثل عناوين URL النسبية في HTML.

// Inside /app/users — link goes to /app/users/new
function UserList() {
  return <Link to="new">Add User</Link>;
}

‏useMatch في المسارات المتداخلة

تُعيد useMatch(pattern) بيانات المطابقة عندما يطابق عنوان URL الحالي النمط المحدد، وهي مفيدة لتنسيق الروابط النشطة في التخطيطات المتداخلة.

function NavLink({ to, children }) {
  const match = useMatch(to);
  return (
    <Link to={to} className={match ? 'active' : ''}>
      {children}
    </Link>
  );
}

حدود الأخطاء لكل مقطع

أضف errorElement إلى أي مسار متداخل لالتقاط الأخطاء في هذا الجزء فقط دون تعطيل غلاف التخطيط بالكامل.

{
  path: 'users',
  element: <UsersLayout />,
  errorElement: <UsersError />,
  children: [
    { path: ':id', element: <UserDetail /> },
  ],
}

نمط عملي: تخطيط لوحة المعلومات

تستخدم لوحة المعلومات النموذجية مسارًا من المستوى الأعلى لغلاف التطبيق، مثل الرأس والشريط الجانبي، مع مسارات متداخلة لكل قسم، مما يُبقي الغلاف مثبتًا بينما تتغير منطقة المحتوى فقط.

function DashboardShell() {
  return (
    <div className="dashboard">
      <Sidebar />
      <div className="content">
        <Outlet />
      </div>
    </div>
  );
}

تحقق سريع

ما المكوّن الذي يجب أن يعرضه تخطيط الأب لعرض مسار الابن المطابق؟

مراجعة

تتيح المسارات المتداخلة للمسارات الأب عرض تخطيطات ثابتة، بينما تملأ المسارات الابنة عنصر <Outlet />. استخدم مسارات الفهرس للأبناء الافتراضيين، والمسارات بلا مسار للتخطيطات المشتركة، وuseOutletContext لتمرير البيانات إلى الأسفل.

الأسئلة الشائعة

هل درس «المسارات المتداخلة وتخطيطات Outlet» مجاني؟

نعم — نص درس «المسارات المتداخلة وتخطيطات Outlet» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «المسارات المتداخلة وتخطيطات Outlet»؟

أنشئ تخطيطات لمسارات متعددة المستويات باستخدام المتداخل والمكوّن . تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «المسارات المتداخلة وتخطيطات Outlet»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. المسارات المتداخلة وتخطيطات Outlet
  2. أدوات التحميل والإجراءات (واجهة Data Router)
  3. المسارات المحمية وحواجز المصادقة
  4. إدارة الحالة في معاملات البحث ضمن URL
← العودة إلى React Academy