انتقل إلى محتوى الدرس
الدرس 50
دورة ReactJS

المسارات المتداخلة والتخطيطات المشتركة عبر OutletNested Routes and Shared Layouts with Outlet

صمّم قوالب تخطيط مشتركة بالمسارات المتداخلة، واعرض الشاشات الفرعية داخل منفذ Outlet مع تحديد المسار الافتراضي index والروابط النسبية ومشاركة بيانات التخطيط عبر useOutletContext.
أقسام الدرس
6
الأمثلة
4
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

تشترك معظم شاشات التطبيق الواحد في هيكل محيط ثابت؛ فصفحات الموقع العامة تشترك في الشريط العلوي والتذييل، ولوحات التحكم تشترك في القائمة الجانبية وشريط الأدوات. تكرار استيراد هذه العناصر يدوياً داخل عشرين ملف صفحة يضاعف الشفرة ويعيد تركيب القائمة الجانبية مع كل نقرة.

تعالج المسارات المتداخلة (Nested Routes) ذلك بتمثيل التدرج البصري مباشرة داخل شجرة <Route>؛ إذ يرسم مسار الأب الإطار المشترك مرة واحدة، وتتبدل المسارات الأبناء بداخله بنعومة.

لتحديد الموضع الدقيق الذي ستظهر فيه الشاشة الفرعية داخل قالب التخطيط الأب، نضع مكون <Outlet /> المستورد من react-router-dom. يعمل <Outlet /> كمنفذ ديناميكي ذكي يستبدل نفسه تلقائياً بمكون المسار الابن المطابق للعنوان الحالي.

HTML
function WorkspaceLayout() {
  return (
    <div className="workspace">
      <WorkspaceNav />
      <main>
        <Outlet />
      </main>
    </div>
  );
}

ماذا يعرض منفذ <Outlet /> عندما يفتح الزائر عنوان الأب مباشرة مثل /dashboard دون مقطع إضافي؟ إذا لم نحدد ابناً افتراضياً، سيبقى المنفذ فارغاً تماماً.

نعالج ذلك بتعريف مسار افتراضي عبر الخاصية المنطقية index دون كتابة خاصية path هكذا: <Route index element={<Overview />} />، ليمتلئ المنفذ تلقائياً بملخص اللوحة فور فتح عنوان الأب.

مخطط شجري يوضح مسار التخطيط الأب مع منفذ Outlet وتفرعه إلى المسار الافتراضي index والمسارات الفرعية النسبية وسياق البيانات المشترك
HTML
<Route path="/dashboard" element={<DashboardLayout />}>
  <Route index element={<OverviewCards />} />
  <Route path="analytics" element={<Analytics />} />
  <Route path="settings" element={<SettingsForm />} />
</Route>

كثيراً ما يمتلك قالب التخطيط الأب بيانات أو دوال مشتركة تحتاجها مساراته الفرعية المباشرة، مثل باقة الاشتراك الحالية أو زر تبديل العرض. بدلاً من إنشاء ملف سياق عام كامل من أجل تخطيط واحد، مرر القيمة مباشرة عبر خاصية <Outlet context={value} /> في الأب، واقرأها داخل أي مسار فرعي بخطاف useOutletContext().

HTML
function StudioShell() {
  const [tier, setTier] = useState('Starter');
  return <Outlet context={{ tier, setTier }} />;
}
function BillingChild() {
  const { tier, setTier } = useOutletContext();
  return (
    <button onClick={() => setTier('Pro')}>
      {tier}
    </button>
  );
}

تجمع التطبيقات الاحترافية عدة قوالب تخطيط مستقلة داخل شجرة <Routes> واحدة بنظافة تامة؛ كقالب عام يحيط بصفحات الزوار مثل الرئيسية والأسعار، وقالب لوحة تحكم مستقل يحيط بمسارات /dashboard الفرعية. يلخص الجدول التالي لبنات التداخل المعمارية:

أداة التداخلالصياغة في JSXالدور المعماري في التخطيط
مسار التخطيط الأب<Route path="/app" element={<Shell />}>يثبّت القائمة المشتركة والحالة أثناء التنقل بين الصفحات الفرعية
منفذ العرض الفرعي<Outlet />يرسم مكون المسار الابن النشط في موضعه المحدد داخل القالب
المسار الافتراضي<Route index element={<Home />} />يمثل الشاشة الفرعية التلقائية عند زيارة عنوان الأب مباشرة
سياق المنفذ المشتركuseOutletContext()ينقل بيانات القالب الأب إلى الشاشات الفرعية دون تكرار
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

صممت في هذا الدرس قوالب التخطيط المستمرة عبر المسارات المتداخلة، وعرضت الشاشات الفرعية داخل منفذ Outlet، وضبطت المسار الافتراضي بخاصية index والروابط النسبية، وشاركت بيانات التخطيط عبر خطاف useOutletContext. الخطوة التالية: انتقل الآن إلى الدرس رقم 51 «التنقل البرمجي وصفحة عدم العثور والمسارات المحمية» لمواصلة البناء التراكمي المتدرج في مسار React الحديث.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Layout Route مسار التخطيط المشترك
مسار أب يرسم الهيكل الثابت المشترك كالشريط العلوي والقائمة الجانبية حول المسارات الفرعية.
للمراجعة
02 Outlet منفذ العرض الفرعي
مكون يوضع داخل قالب التخطيط الأب ليظهر في مكانه مكون المسار الابن المطابق للعنوان الحالي.
للمراجعة
03 Index Route المسار الفرعي الافتراضي
مسار ابن يحمل خاصية index بدون مسار فرعي ليملأ منفذ الأب تلقائياً عند فتح عنوان الأب.
للمراجعة
04 useOutletContext خطاف سياق المنفذ
خطاف يتيح لمكونات المسارات الأبناء قراءة القيم الممررة في خاصية context على منفذ الأب.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 DRY DRY
Don’t Repeat Yourself
مبدأ عدم تكرار الشفرة الذي تحققه قوالب التخطيط بكتابة القوائم المشتركة في مكون أب واحد.
للمراجعة
02 UI UI
User Interface
التدرج البصري لمناطق الشاشة الذي ينعكس مباشرة في شجرة المسارات المتداخلة.
للمراجعة
03 URL URL
Uniform Resource Locator
مقاطع المسار المتدرجة التي يفعّل كل مستوى منها طبقة مقابلة في شجرة التخطيط.
للمراجعة
04 SPA SPA
Single-Page Application
تطبيق صفحة واحدة تظل فيه القوالب الخارجية مركبة بالذاكرة بينما تتبدل اللوحات الداخلية عبر المنفذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. افتح مثال المسار الافتراضي في محرر التجريب وأضف رابط ومسار reports الفرعي واختبر سلاسة التبديل داخل Outlet.

  2. في مثال StudioShell، أضف اسم مساحة العمل داخل كائن context في Outlet واعرضه في مكون UsagePanel الفرعي.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

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

يمثل مكون <Outlet /> المنفذ الذي تُرسم بداخله الشاشة الفرعية النشطة.

02

عند التنقل بين مسارين فرعيين يشتركان في نفس مسار التخطيط الأب، يظل مكون الأب مركباً ويحتفظ بحالته المحلية.

صواب؛ يتبدل محتوى منفذ Outlet فقط بينما يظل القالب الأب وحالته حيين دون إعادة تركيب.

03

كيف تعرّف مساراً فرعياً يظهر تلقائياً داخل <Outlet /> عند زيارة عنوان الأب /dashboard مباشرة؟

نستخدم الخاصية المنطقية index دون كتابة path، مثل <Route index element={<Overview />} />.

04

داخل مكون معروض تحت المسار /account، إلى أي عنوان يشير الرابط النسبي <Link to="billing">؟

بما أن الرابط لا يبدأ بشرطة مائلة، يُبنى نسبياً فوق مسار الأب ليصبح /account/billing.

05

ما العلامة النحوية التي تميز الرابط المطلق عن الرابط النسبي في خاصية to؟

يبدأ الرابط المطلق بشرطة مائلة أمامية "/" من جذر الموقع، بينما يخلو الرابط النسبي منها.

06

كيف يمرر قالب التخطيط الأب بيانات مشتركة إلى مكونات المسارات الأبناء عبر Outlet؟

بتمرير البيانات في خاصية <Outlet context={...} /> وقراءتها في الابن عبر خطاف useOutletContext().

07

يتيح مسار التخطيط الخالي من خاصية path اشتراك عدة صفحات في قالب واحد دون إضافة مقطع زائد لعناوينها.

صواب؛ يغلف القالب الصفحات بصرياً مع بقاء عناوينها مختصرة ونظيفة مثل /pricing و/about.

08

يُسمح للمسار الافتراضي <Route index /> أن يحتوي بداخله على مسارات أبناء متداخلة أخرى.

خطأ؛ المسار الافتراضي index يمثل ورقة عرض نهائية لمنفذ الأب ولا يقبل مسارات فرعية بداخله.

09

كيف يجمع تطبيق React واحد بين قالب بسيط للصفحات العامة وقالب ذي قائمة جانبية لمسارات /dashboard/*؟

بتعريف فرعي تخطيط أب مستقلين داخل <Routes>، يضم كل فرع مكون القالب الخاص به ومنفذ <Outlet />.

10

ماذا يعرض <Outlet /> عند فتح عنوان الأب /dashboard مباشرة في حال عدم تعريف مسار index افتراضي؟

إذا لم يطابق أي مسار ابن ولم يوجد مسار index افتراضي، يعيد المنفذ القيمة null فلا يظهر محتوى فرعي.