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

ذاكرة المكون عبر useState وقواعد الخطافاتComponent State with useState and Rules of Hooks

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

تحتاج المكونات التفاعلية باستمرار لتذكر قيم تتغير بفعل المستخدم مثل رقم الشريحة المعروضة أو حالة فتح القائمة أو عداد السلة، وتُعرف هذه الذاكرة الخاصة بالمكون في React باسم الحالة (State).

عندما يجرب المبتدئ تعريف متغير محلي عادي مثل let index = 0 وزيادته داخل حدث النقر فإنه يصطدم بعائقين: الأول أن المتغيرات المحلية لا تبقى حية بين التصييرات بل تُنشأ من الصفر في كل استدعاء، والثاني أن تعديلها لا يرسل أي إشارة إلى React بضرورة إعادة رسم الشاشة.

HTML
import { useState } from 'react';

function LessonStepper() {
  const [step, setStep] = useState(1);
  return (
    <button onClick={() => setStep(step + 1)}>
      Current Lesson Step: {step}
    </button>
  );
}

لإضافة ذاكرة حية إلى مكونك، استورد الخطاف useState من حزمة 'react' واستدعه في مطلع الدالة بالقيمة المبدئية هكذا const [count, setCount] = useState(0). يعيد هذا الاستدعاء مصفوفة ثنائية نفككها إلى عنصرين متلازمين:

  1. متغير القراءة الحالي (count): يحمل القيمة المحفوظة لهذه اللحظة.
  2. دالة ضبط الحالة (setCount): تحدّث القيمة المخزنة وتطلب من React إعادة تصيير المكون فوراً.

يمكن للمكون الدالي الواحد استدعاء useState عدة مرات لحفظ قيم متعددة. امنح كل زوج اسماً معبراً مثل [activeTab, setActiveTab] و[showHint, setShowHint]؛ ففصل القيم غير المترابطة في خطافات مستقلة يجعل تحديث كل قيمة مباشراً وبسيطاً.

مقارنة بين المتغير المحلي العادي الذي يفشل في تحديث الشاشة وخطاف useState الذي يحفظ الحالة ويعيد تصيير المكون
HTML
import { useState } from 'react';
function QuizFlashcard() {
  const [pts, setPts] = useState(0);
  const [open, setOpen] = useState(false);
  const flip = () => setOpen(!open);
  return (
    <p>
      <button onClick={() => setPts(1)}>+1</button>
      <button onClick={flip}>Hint ({pts})</button>
    </p>
  );
}

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

HTML
import { useState } from 'react';

function VoteWidget({ track }) {
  const [votes, setVotes] = useState(0);
  return (
    <button onClick={() => setVotes(votes + 1)}>
      {track}: {votes} votes
    </button>
  );
}

تُسمى الدوال المبدوءة بالسابقة use في React الخطافات (Hooks)، وتخضع لقاعدتين صارمتين لا استثناء فيهما:

  1. الاستدعاء في المستوى الأعلى فقط: يُحظر تماماً استدعاء useState() داخل جمل شرطية if أو حلقات تكرار أو دوال فرعية أو بعد جملة إرجاع مبكرة return.
  2. الاستدعاء داخل دوال React فقط: تُستدعى الخطافات حصراً داخل المكونات الدالية أو الخطافات المخصصة.

لماذا تشترط React ثبات ترتيب الخطافات في كل تصيير؟ لاحظ أن استدعاء useState(0) لا يمرر اسماً نصياً للمتغير، بل تحتفظ React داخلياً بمصفوفة خلايا مرقمة لكل مكون وتقرأها بفهرس متسلسل (0 ثم 1 ثم 2) أثناء الرسم. فإذا اختفى خطاف داخل شرط if اختلّت فهارس كافة الخطافات التالية له. يلخص الجدول التالي الفروق الحاسمة:

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

ملخص الدرس

حصاد الدرس

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

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

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

مشاركة

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

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

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

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 State حالة المكون
الذاكرة التفاعلية الخاصة بالمكون التي تديرها React وتؤدي تغييراتها إلى إعادة رسم الواجهة تلقائياً.
للمراجعة
02 Hook الخطاف البرمجي
دالة خاصة في React تبدأ بالسابقة use تتيح للمكونات الدالية الاستفادة من ميزات الحالة ودورة الحياة.
للمراجعة
03 Setter Function دالة ضبط الحالة
العنصر الثاني الذي يعيده خطاف useState ويُستخدم لتخزين القيمة الجديدة وطلب إعادة تصيير المكون.
للمراجعة
04 Instance Isolation استقلال ذاكرة النسخة
ضمان معماري يمنح كل نسخة معروضة من المكون خلايا حالة مستقلة تماماً عن بقية النسخ في الشاشة.
للمراجعة

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

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

الاختصارات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 UI UI
User Interface
واجهة العرض البصرية التي تعيد React مزامنتها تلقائياً مع كل تحديث في متغيرات الحالة.
للمراجعة
02 ES6 ES6
ECMAScript 2015
معيار اللغة الحديث الذي وفر صياغة تفكيك المصفوفات المستخدمة مع خطاف useState.
للمراجعة
03 AST AST
Abstract Syntax Tree
التمثيل الشجري للكود الذي تفحصه أداة التدقيق لاكتشاف أي خرق لقواعد الخطافات أثناء الكتابة.
للمراجعة
04 DOM DOM
Document Object Model
شجرة المتصفح التي تحدث React الأجزاء المتغيرة منها بكفاءة عقب تغير حالة المكون.
للمراجعة

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

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

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

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

0/2مهام منجزة
  1. افتح مثال عرض النصائح في محرر التجريب وأضف زراً ثالثاً يستدعي setIndex(0) للعودة الفورية إلى الشريحة الأولى.

  2. في مثال عزل النسخ بمحرر التجريب، أضف نسخة ثالثة من مكون التصويت وتأكد أن عدادها يزداد بمعزل تام عن النسختين الأخريين.

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

مساحة التحدي

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

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

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

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

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

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

لماذا يفشل تعديل متغير محلي عادي مثل let count = 0 داخل دالة النقر في تحديث شاشة مكون React؟

لأن المتغيرات المحلية تتصفر في كل تصيير ولا تُشعر React بوجوب إعادة رسم الواجهة.

02

ما العنصران اللذان تعيدهما المصفوفة الثنائية الناتجة عن استدعاء useState(initialValue)؟

تعيد مصفوفة تضم القيمة الحالية للحالة أولاً ثم دالة التحديث ثانياً.

03

عند عرض المكون <Counter /> مرتين في نفس الصفحة، فإن النقر على الأول يزيد عداد الثاني تلقائياً.

خطأ؛ فذاكرة الحالة معزولة ومستقلة تماماً لكل نسخة مكون معروضة على الشاشة.

04

أي ممارسة مما يلي تخرق القواعد الصارمة لاستدعاء الخطافات في React؟

يُحظر استدعاء أي خطاف داخل جمل شرطية if أو حلقات تكرار أو بعد إرجاع مبكر.

05

كيف تربط React داخلياً كل استدعاء لخطاف useState بخلية الذاكرة الصحيحة الخاصة به عبر التصييرات؟

تعتمد React على ثبات فهرس وترتيب استدعاء الخطافات المتطابق في كل عملية تصيير.

06

يُسمح للمكون الدالي الواحد باستدعاء useState عدة مرات لحفظ قيم حالة مستقلة عن بعضها.

صواب؛ فتقسيم القيم غير المترابطة في عدة استدعاءات useState يجعل التحديث أوضح وأسهل صيانة.

07

متى تُستخدم القيمة الأولية الممررة في useState(0) لتحديد قيمة الحالة؟

تُعتمد القيمة المبدئية خلال التصيير الأول للمكون فقط، ثم تُقرأ القيمة المحدثة في التصييرات اللاحقة.

08

إذا تضمن المكون إرجاعاً شرطياً مبكراً مثل if (!open) return null، فيجب وضع كافة استدعاءات useState قبله في الأعلى.

صواب؛ لأن وضع خطاف بعد إرجاع شرطي يغير عدد الخطافات المستدعاة بين التصييرات ويسبب خطأً فورياً.

09

ما الفارق المعماري الجوهري بين الخصائص props والحالة state في مكونات React؟

تمثل props مدخلات للقراءة فقط يمررها الأب، بينما تمثل state الذاكرة الداخلية التي يحدثها المكون بدالة الضبط.

10

بأي بادئة إنجليزية قياسية يبدأ اسم كل خطاف Hook في مكتبة React؟

تبدأ جميع الخطافات المدمجة والمخصصة في React بالسابقة القياسية use.