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

مشاركة البيانات بعمق عبر createContext وuseContextSharing Data Deeply with createContext and useContext

تخلص من عبء تمرير الخصائص عبر طبقات وسيطة متعددة في React باستخدام createContext ومزود السياق وخطاف useContext، واعرف متى يغنيك التركيب عنها.
أقسام الدرس
6
الأمثلة
4
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

يُعد تمرير الخصائص الصريح من الأب إلى الابن من أبرز نقاط القوة في React لأنه يجعل مسار البيانات مكشوفاً وواضحاً. غير أن المشقة تظهر عندما تحتاج معلومة مشتركة — مثل العملة المختارة أو صلاحية الحساب أو كثافة العرض — للوصول إلى مكونات عميقة بينما تضطر قوالب التخطيط الوسيطة مثل الإطار العام والعمود الجانبي لاستلامها وتمريرها دون أي استخدام فعلي لها.

يُعرف تمرير نفس الخاصية عبر سلسلة طويلة من الوسطاء بمصطلح حفر الخصائص (Prop Drilling). لمعالجة هذا التضخم، توفر React آلية السياق (Context) لبث البيانات من المكون الأب إلى أي حفيد في الشجرة تحته مباشرة دون إزعاج المكونات الوسيطة.

يسير العمل بالسياق في React دائماً وفق ثلاث خطوات مترابطة:

  1. إنشاء السياق: استدعاء createContext('USD') خارج دوال المكونات في نطاق الملف مع تمرير قيمة افتراضية احتياطية منطقية.
  2. توفير القيمة للشجرة: تغليف الجزء المستهدف من الواجهة بالمزود <CurrencyContext.Provider value={...}> لبث القيمة لأسفل.
  3. قراءة القيمة: استدعاء خطاف useContext(CurrencyContext) داخل أي مكون فرعي يحتاجها.
HTML
import { createContext, useContext } from 'react';

const CurrencyContext = createContext('USD');

function PriceTag() {
  const code = useContext(CurrencyContext);
  return <span>Currency: {code}</span>;
}

يكتسب السياق حيويته الكاملة عند دمجه مع حالة تفاعلية عبر useState أو useReducer في المكون الأب. فكلما تغيرت القيمة المسندة إلى خاصية value={plan} في المزود، تعيد React تلقائياً رسم كل مكون فرعي يستدعي useContext(PlanContext) بأسفله، دون أن تمر أي خاصية عبر المكونات الوسيطة.

مخطط شجري يوضح بث البيانات مباشرة من مزود السياق في الجذر إلى المكونات الفرعية العميقة عبر useContext
HTML
function Dashboard() {
  const [plan, setPlan] = useState('Pro');
  return (
    <PlanContext.Provider value={plan}>
      <Sidebar />
      <button onClick={() => setPlan('Team')}>
        Upgrade Plan
      </button>
    </PlanContext.Provider>
  );
}

يُخبر استدعاء useContext(RoleContext) مكتبة React بأن هذا المكون مشترك في تغييرات ذلك السياق. لاحظ أننا نمرر كائن السياق نفسه إلى الدالة لا اسماً نصياً ولا عنصر المزود. وكحال جميع الخطافات، يُستدعى useContext في المستوى الأعلى لدالة المكون خارج الشروط والحلقات، ويمكن لعشرات المكونات المتجاورة أو المتباعدة قراءة السياق ذاته في آنٍ واحد.

HTML
function AccessBadge() {
  const role = useContext(RoleContext);
  return (
    <p className="badge">
      Active Role: <strong>{role}</strong>
    </p>
  );
}

تماماً كما تتجاوز قاعدة تنسيق CSS الداخلية القاعدة العامة للعناصر التي بداخلها فقط، يدعم السياق في React تداخل المزودات وتخصيص الفروع. فعند استدعاء useContext(LevelContext) تبحث React صعوداً في الشجرة وتجلب القيمة من أقرب مزود يعلو المكون مباشرة؛ مما يتيح تغليف قسم فرعي بمزود جديد يخصص قيمته دون التأثير في بقية أقسام الصفحة.

HTML
function SubSection({ children }) {
  const level = useContext(LevelContext);
  return (
    <LevelContext.Provider value={level + 1}>
      <section>{children}</section>
    </LevelContext.Provider>
  );
}

لسهولة استخدام السياق قد يميل المبتدئ لتطبيقه في كل مكان، لكن التوثيق الهندسي الرسمي يوصي بخطوتين أبسط قبل إنشاء أي سياق جديد: أولاً، ابدأ بتمرير الخصائص العادية للمسافات القصيرة لأنها تجعل تدفق البيانات صريحاً وسهل الصيانة؛ ثانياً، وظف التركيب عبر خاصية children بتمرير المكون الجاهز مباشرة داخل الغلاف فلا يحتاج القالب الوسيط لمعرفة بياناته أصلاً. وادخر السياق للبيانات المشتركة على نطاق واسع عبر مستويات متباعدة كما يلخص الجدول التالي:

زاوية المقارنةالخصائص الصريحة والتركيب بـ childrenسياق React عبر createContext وuseContext
وضوح مسار البياناتصريح ومباشر في معاملات دالة المكوناشتراك ضمني يُبحث عنه في أسلاف الشجرة
استقلالية إعادة الاستخداميعمل المكون منفرداً في أي شاشة بتمرير خصائصهيعتمد على وجود مزود مناسب فوقه أو القيمة الاحتياطية
ارتباط الطبقات الوسيطةينعدم تماماً عند تمرير العناصر عبر childrenينعدم تمرير الخصائص العابرة في الوسطاء
الاستخدام الهندسي الأمثلالبيانات القريبة وقوالب التغليف والتخطيطالسمة اللونية واللغة والحساب النشط والأشجار العميقة
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

شخصت في هذا الدرس مشكلة حفر الخصائص العميق، وأتقنت الخطوات الثلاث لإنشاء السياق وتوفيره وقراءته عبر createContext وProvider وuseContext، وجرّبت تخصيص القيم بتداخل المزودات الفرعية، وتعرفت على متى يكون تمرير الخصائص أو التركيب بـ children أنظف من السياق. الخطوة التالية: انتقل الآن إلى الدرس رقم 30 «بناء مزود الثيم واللغة ثنائي الاتجاه عبر Context» لمواصلة البناء التراكمي المتدرج في مسار React الحديث.

مشاركة

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

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

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

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Prop Drilling حفر الخصائص
تمرير نفس الخصائص عبر عدة طبقات وسيطة لا تستخدمها لمجرد إيصالها إلى مكون حفيد في أسفل الشجرة.
للمراجعة
02 React Context سياق React
آلية تتيح للمكون الأب إتاحة البيانات مباشرة لأي مكون يقع تحته في الشجرة دون تمرير يدوي عبر الوسطاء.
للمراجعة
03 Context Provider مزود السياق
مكون التغليف التابع لكائن السياق والذي يبث القيمة المحددة في خاصية value لجميع المكونات الفرعية بداخله.
للمراجعة
04 Context Consumer Hook خطاف استهلاك السياق
خطاف useContext الذي يقرأ القيمة من أقرب مزود مطابق يعلو المكون ويعيد رسمه تلقائياً عند تغيرها.
للمراجعة

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

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

الاختصارات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 UI UI
User Interface
شجرة عناصر الواجهة التي تُبث عبرها التفضيلات المشتركة كاللغة والعملة والسمة اللونية بسلاسة.
للمراجعة
02 JSX JSX
JavaScript XML
الصياغة التصريحية المستخدمة لتغليف فروع الواجهة بمزودات السياق أو تمرير الأبناء عبر خاصية children.
للمراجعة
03 API API
Application Programming Interface
واجهة خصائص المكون التي تظل نظيفة ومختصرة بفضل الاستغناء عن تمرير البيانات العابرة غير المستخدمة.
للمراجعة
04 SPA SPA
Single-Page Application
تطبيقات الصفحة الواحدة التي تعتمد على مزودات السياق الجذرية لمشاركة بيانات المستخدم واللغة عبر الشاشات.
للمراجعة

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

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

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

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

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

  2. افتح مثال هيكل المستند في محرر التجريب وأضف طبقة SectionBox إضافية بالداخل ولاحظ كيف يقرأ كل عنوان من أقرب مزود فوقه مباشرة.

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

مساحة التحدي

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

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

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

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

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

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

ماذا يصف مصطلح حفر الخصائص Prop Drilling في شجرة مكونات React؟

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

02

ما الدالة الرسمية في مكتبة React المخصصة لإنشاء كائن سياق جديد خارج المكونات؟

تنشئ الدالة createContext(defaultValue) كائن سياق جديداً يقبل قيمة افتراضية احتياطية.

03

متى تعتمد React على القيمة الافتراضية الممررة إلى createContext(defaultValue)؟

تُقرأ القيمة الافتراضية حصرياً عندما يستدعي المكون useContext دون وجود أي مزود مطابق يعلوه في الشجرة.

04

عند تغير قيمة الحالة الممررة لخاصية value في مزود السياق، تعيد المكونات المستهلكة رسم نفسها بالقيمة الجديدة تلقائياً.

صواب؛ تحدث React كل مكون مشترك عبر useContext فور تغير قيمة المزود دون تمرير خصائص للوسطاء.

05

ما المعامل الصحيح الذي يجب تمريره إلى خطاف useContext(...) داخل المكون الفرعي؟

يمرر دائماً كائن السياق نفسه مثل CurrencyContext وليس سلسلة نصية أو عنصر المزود.

06

لا يُسمح إلا لمكون واحد فقط في التطبيق بأكمله بقراءة نفس كائن السياق عبر useContext.

خطأ؛ يمكن لعدد غير محدود من المكونات على مختلف المستويات تحت المزود قراءة نفس السياق معاً.

07

إذا أُحيط مكون حفيد بمزودين متداخلين لنفس السياق (الخارجي بقيمة 1 والداخلي الأقرب بقيمة 2)، فما القيمة التي يعيدها useContext؟

يجلب خطاف useContext دائماً القيمة من أقرب مزود مطابق يعلو المكون مباشرة في الشجرة، وهي هنا 2.

08

يمكن تغليف شجرة المكونات نفسها بمزودين لسياقين منفصلين مثل المظهر والصلاحية دون أن يلغي أحدهما الآخر.

صواب؛ كل سياق منشأ باستدعاء مستقل لـ createContext يمثل قناة مستقلة تماماً لا تتعارض مع غيرها.

09

قبل التسرع في إنشاء سياق جديد لتفادي تمرير بيانات عبر مكون تخطيط واحد، ما الأسلوب الأبسط الذي توصي به React أولاً؟

تمرير العناصر الجاهزة عبر خاصية children يغني قالب التخطيط عن استلام بيانات الأبناء أو تمريرها.

10

أي نوع من البيانات التالية يُعد مثالاً كلاسيكياً مثالياً لاستخدام سياق React؟

الإعدادات العامة المشتركة بعمق مثل السمة اللونية ولغة الواجهة والحساب النشط هي الاستخدام الأمثل للسياق.