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

رفع الحالة للأعلى وهوية بقاء أو تصفير الحالةLifting State Up and Preserving State Identity

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

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

في نموذج تدفق البيانات أحادي الاتجاه في React لا تعدل المكونات الشقيقة بعضها مباشرة، بل تتنسق عبر المكون الأب المشترك بينها.

HTML
function SyncedLengths() {
  const [m, setM] = useState(2);
  return (
    <div>
      <UnitField unit="m" value={m} onChange={setM} />
      <UnitField unit="cm" value={m * 100}
        onChange={(cm) => setM(cm / 100)} />
    </div>
  );
}

يُنفّذ رفع الحالة للأعلى (Lifting State Up) في ثلاث خطوات هندسية واضحة:

  1. إزالة متغير useState() المحلي من المكونات الأبناء.
  2. تمرير القيمة المشتركة نزولاً من أقرب أب مشترك عبر الخصائص مثل isActive={activeIndex === 0}.
  3. تمرير دالة معالجة حدث نزولاً مثل onShow={() => setActiveIndex(0)} ليطلب الابن من أبيه تحديث الحالة عند التفاعل.
HTML
function Accordion() {
  const [activeIdx, setActiveIdx] = useState(0);
  return (
    <>
      <Panel title="Overview" isActive={activeIdx === 0}
        onShow={() => setActiveIdx(0)} />
      <Panel title="Syllabus" isActive={activeIdx === 1}
        onShow={() => setActiveIdx(1)} />
    </>
  );
}

يمتد مصطلحا ذاتي الإدارة (Uncontrolled) والموجَّه بالخصائص (Controlled) في معمارية React ليشملا مكوناتك المخصصة كلها وليس عناصر النماذج فحسب:

  • المكون ذاتي الإدارة: يحتفظ بحالته داخلياً عبر useState()، فيسهل تركيبه بأقل إعدادات لكن يصعب تنسيقه خارجياً.
  • المكون الموجَّه بالخصائص: يستقبل حالته ودوال تغييره من أبيه عبر Props، مما يمنح الأب تحكماً كاملاً في تنسيقه مع أشقائه.
شجرة مكونات توضح امتلاك المكون الأب للحالة وتمريرها للوحين الشقيقين مع آلية تصفير الحالة بتغيير خاصية key

كيف تميز React أي حالة تخص أي مكون عبر عمليات إعادة التصيير؟ تربط المكتبة كل حالة بموضع المكون داخل شجرة العرض وليس بسطر JSX المكتوب في الملف!

فإذا بدل شرط ثلاثي بين <ScoreCounter isFancy={true} /> و<ScoreCounter isFancy={false} /> في نفس الموضع الأول تماماً، ترى React أنه نفس نوع المكون في نفس الخانة الشجرية فتحافظ على قيمة عداده دون مسح.

HTML
function Arena() {
  const [highlight, setHighlight] = useState(false);
  return (
    <div>
      {highlight ? <Counter accent /> : <Counter />}
      <button onClick={() => setHighlight(!highlight)}>
        Toggle Style
      </button>
    </div>
  );
}

في المقابل، تحذف React حالة المكون بالكامل فور إزالته من الشجرة بـ false أو استبدال نوع العنصر في ذلك الموضع بنوع مختلف، كاستبدال الغلاف <div> بوسم <section>.

ولهذا السبب تحديداً، إياك وتعريف دالة مكون فرعي داخل جسم دالة مكون أب؛ لأن ذلك ينشئ مرجع دالة جديداً في كل تصيير فتظنه React مكوناً مختلفاً وتمسح حالته وتركيز المؤشر مع كل ضغطة مفتاح!

أحياناً يشغل المكون نفس الموضع والنوع في الشجرة لكنه يمثل كياناً مختلفاً منطقياً، مثل صندوق كتابة محادثة <ChatComposer /> عند التبديل من مراسلة «سارة» إلى «عمر». افتراضياً تحتفظ React بنص المسودة المكتوب مما قد يوقع المستخدم في خطأ إرسال الرسالة للشخص الخطأ!

مرر خاصية key={selectedUser.id} لإبلاغ React بأن صندوق كل مستلم يمثل هوية مستقلة؛ فبمجرد تغير المفتاح تحذف المكتبة النسخة السابقة وتنشئ نسخة نظيفة بحالة ابتدائية فارغة:

سيناريو شجرة الواجهةسلوك المطابقة في Reactمصير حالة المكون
نفس نوع المكون في نفس الموضعتحديث خصائص النسخة القائمة نفسهاتبقى الحالة محفوظة كما هي
تغير نوع العنصر أو إزالتهإزالة الفرع القديم وبناء فرع جديدتُمسح الحالة القديمة بالكامل
تغير قيمة خاصية المفتاح keyالتعامل معه كهوية مكون جديدة مستقلةتصفير الحالة تلقائياً للقيم الابتدائية
رفع الحالة للأب المشترك الأقربتمرير القيمة ودالة التحديث عبر الخصائصتزامن تام ولحظي بين المكونات الشقيقة
HTML
function Messenger() {
  const [to, setTo] = useState(CONTACTS[0]);
  return (
    <div>
      <ContactList list={CONTACTS} onSelect={setTo} />
      <ChatBox key={to.id} contact={to} />
    </div>
  );
}
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

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

مشاركة

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

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

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

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Lifting State Up رفع الحالة للأعلى
نقل الحالة من المكونات الفرعية إلى أقرب أب مشترك بينها لتتشارك جميعاً مصدراً واحداً للحقيقة.
للمراجعة
02 Closest Common Parent الأب المشترك الأقرب
أقرب مكون حاضن في الشجرة يعلو كافة المكونات الفرعية المحتاجة لقراءة أو تعديل الحالة المشتركة.
للمراجعة
03 UI Tree Position الموضع في شجرة العرض
الموقع البنيوي الذي يشغله المكون داخل شجرة الواجهة وترتبط به ذاكرة خطافاته عبر التصييرات.
للمراجعة
04 Key-Based Reset التصفير عبر المفتاح key
تمرير خاصية key متغيرة لإجبار React على إزالة حالة النسخة القديمة وإنشاء حالة نظيفة جديدة.
للمراجعة

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

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

الاختصارات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 API API
Application Programming Interface
عقد الخصائص ودوال الأحداث الذي يقدمه المكون الفرعي لأبيه للتحكم في سلوكه.
للمراجعة
02 UI UI
User Interface
شجرة المكونات التي تبنيها React من JSX لتتبع هوية العناصر وحفظ حالتها.
للمراجعة
03 USD USD
United States Dollar
مثال شائع في محولات العملات ثنائية الحقل التي تعتمد على رفع الحالة إلى الأب المشترك.
للمراجعة
04 JSX JSX
JavaScript XML
الصياغة التصريحية التي تحدد شجرة العناصر المعادة منها مواضع المكونات أثناء المطابقة.
للمراجعة

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

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

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

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

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

  2. افتح مثال Messenger واكتب مسودة لسارة ثم انتقل لعمر لملاحظة تصفير النص بفضل خاصية key وجرب حذفها لرؤية الفارق.

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

مساحة التحدي

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

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

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

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

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

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

عندما يحتاج مكونان شقيقان إلى بقاء واجهتهما متزامنة دائماً، أين ينبغي أن توضع حالتهما المشتركة؟

تُرفع الحالة إلى أقرب مكون أب مشترك بينهما وتُمرر القيمة ودالة التحديث نزولاً عبر الخصائص.

02

كيف يبلغ المكون الابن الموجَّه أباه المشترك برغبة المستخدم في توسيعه عند النقر؟

باستدعاء دالة رد النداء الممررة إليه كخاصية من الأب مثل onShow.

03

عند تبديل الشرط بين نسختين من نفس المكون Counter في نفس الموضع تماماً تحتفظ React بحالة العداد دون تصفير.

صواب؛ لأن نفس نوع المكون لا يزال يشغل الخانة نفسها في شجرة العرض.

04

لماذا يُحظر تعريف دالة مكون فرعي داخل جسم دالة مكون أب في React؟

لأن كل تصيير للأب ينشئ دالة بمؤشر جديد فتعتبره React مكوناً مختلفاً وتمسح حالته وتركيزه في كل مرة.

05

كيف تخبر React بتصفير جميع الحالات الداخلية لمكون المحادثة ChatBox تلقائياً فور تغير معرّف المستلم؟

بتمرير خاصية key={active.id} للمكون فتنشئ React نسخة جديدة نظيفة لكل مستلم.

06

يقتصر عمل خاصية key في React على حلقات تكرار المصفوفات فقط ولا أثر لها على المكونات المنفردة.

خطأ؛ تعمل خاصية key مع أي مكون لتحديد هويته وتصفير حالته متى تغيرت قيمة المفتاح.

07

في مصطلحات هندسة المكونات، ماذا يُسمى المكون المخصص الذي تُدار حالته بالكامل عبر خصائص يمررها المكون الأب؟

يُسمى مكوناً موجَّهاً أو محكوماً بالخصائص Controlled Component.

08

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

صواب؛ إزالة المكون من شجرة الواجهة تنهي دورة حياته وتمسح حالته المحلية.

09

ماذا يحدث لحالة العداد الداخلي إذا تغير العنصر الحاضن له في الموضع نفسه من div إلى article؟

تغير نوع العنصر الأب من div إلى article يهدم الشجرة الفرعية القديمة وينشئ شجرة جديدة فتتصفر حالة العداد.

10

إذا عرضت مكونين <Counter /> متجاورين جنباً إلى جنب داخل نفس الحاوية، فكيف تتصرف حالتاهما؟

يشغل كل منهما موضعاً مستقلاً في الشجرة فيحتفظ كل عداد بحالته المنفصلة تماماً.