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

الأحداث الاصطناعية وانتشار الحدث والسلوك الافتراضيSynthetic Events Propagation and Default Behavior

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

تمرر مكتبة React تلقائياً معامل حدث وحيداً يُسمى عرفاً e أو event إلى كل دالة معالجة، وهو كائن الحدث الاصطناعي الموحد (SyntheticEvent). يغلف هذا الكائن حدث المتصفح الأصلي ليوحد جميع الخصائص والدوال القياسية مثل e.type وe.key وe.clientX عبر مختلف المتصفحات والأجهزة دون تناقضات.

وإذا احتجت في حالات خاصة نادرة إلى كائن الحدث الخام التابع للمتصفح مباشرةً، يمكنك قراءته عبر الخاصية e.nativeEvent.

HTML
function KeyAndClickProbe({ onInspect }) {
  function handleClick(e) {
    onInspect(`type=${e.type}, button=${e.button}`);
  }
  return (
    <button type="button" onClick={handleClick}>
      Inspect SyntheticEvent
    </button>
  );
}

تتشابه خاصيتان مهمتان داخل كائن الحدث ظاهرياً لكن لكل منهما دلالة دقيقة يجب التمييز بينها:

  • الخاصية e.target: تشير إلى أعمق عنصر فرعي نقر عليه المؤشر فعلياً، مثل وسم <strong> أو شارة داخلية بداخل الزر.
  • الخاصية e.currentTarget: تشير دائماً إلى العنصر المحدد الذي يحمل خاصية المعالج مثل عنصر <button> الأب نفسه.

لذلك اعتمد دائماً على e.currentTarget عند قراءة سمات العنصر الحاضن للأيقونات والنصوص الفرعية.

HTML
function PlanButton({ onRead }) {
  function handlePick(e) {
    const hit = e.target.tagName;
    const owner = e.currentTarget.tagName;
    onRead(`target=${hit}, currentTarget=${owner}`);
  }
  return (
    <button type="button" onClick={handlePick}>
      <strong>Pro Plan</strong> <span>($19)</span>
    </button>
  );
}

تصعد جميع الأحداث تقريباً في React—باستثناء أحداث التمرير مثل onScroll—من الأسفل إلى الأعلى (Bubbling) عبر شجرة المكونات. فإذا وضعت زر «حفظ بالمفضلة» داخل بطاقة درس قابلة للنقر يحمل كلاهما خاصية onClick، فإن النقر على الزر سيشغّل معالج الزر أولاً ثم يصعد فوراً ليشغّل معالج البطاقة الأب ثانياً.

المراحل الثلاث لانتشار الحدث في React: الالتقاط التنازلي ثم تنفيذ الهدف ثم الصعود للأب أو إيقافه بدالة stopPropagation

لمنع نقرة زر فرعي من تشغيل حدث البطاقة الأب أو خلفية النافذة المنبثقة عن طريق الخطأ، استدعِ الدالة e.stopPropagation() في بداية معالج العنصر الابن؛ وبذلك يتوقف صعود الحدث عند هذا المستوى مع إتمام مهمة الزر الفرعي بنجاح.

HTML
function CourseCard({ onLog }) {
  const stopAndSave = (e) => {
    e.stopPropagation();
    onLog('Bookmarked only!');
  };
  return (
    <div onClick={() => onLog('Opened Card')}>
      <h4>Modern React State</h4>
      <button onClick={stopAndSave}>Bookmark</button>
    </div>
  );
}

في حالات معمارية خاصة مثل تسجيل النقرات التحليلية أو تتبع التركيز حتى لو أوقف زر فرعي صعود الحدث بدالة e.stopPropagation()، يمكنك إضافة اللاحقة Capture لأي خاصية حدث مثل onClickCapture لتعمل تنازلياً من الأب نحو الابن قبل مرحلة الصعود.

تمتلك بعض عناصر المتصفح سلوكاً تلقائياً مدمجاً؛ فإرسال عنصر <form> يعيد تحميل الصفحة كاملةً. وهنا نستدعي الدالة e.preventDefault() لإلغاء السلوك الافتراضي للمتصفح مع بقاء التطبيق حياً وسريعاً. احذر دائماً من الخلط بين إيقاف الانتشار ومنع السلوك الافتراضي كما يوضح الجدول المقارن التالي:

الدالة أو الخاصيةالوظيفة الهندسية الدقيقةحالة الاستخدام العملية في React
e.targetأعمق عنصر فرعي نقر عليه المستخدم فعلياًمعرفة العنصر الداخلي المحدد الذي استقبل الضغطة
e.currentTargetالعنصر الحامل لدالة المعالجة الحالية في JSXقراءة بيانات عنصر زر يضم أيقونة ونصاً بداخله
e.stopPropagation()إيقاف صعود الحدث إلى معالجات المكونات الأبعزل زر الحفظ أو الحذف داخل بطاقة قابلة للنقر
e.preventDefault()إلغاء السلوك الافتراضي المدمج في المتصفحمنع إعادة تحميل الصفحة عند إرسال نماذج <form>
HTML
function NewsletterForm({ onSubmitted }) {
  function handleSubmit(e) {
    e.preventDefault();
    onSubmitted('Subscribed without page reload!');
  }
  return (
    <form onSubmit={handleSubmit}>
      <button type="submit">Subscribe</button>
    </form>
  );
}
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

استكشفت في هذا الدرس كائن الحدث الاصطناعي الموحد SyntheticEvent، وفرقت عملياً بين target وcurrentTarget، وتتبعت مرحلتي الالتقاط والصعود عبر شجرة المكونات مع عزل النقرات الفرعية بـ stopPropagation ومنع تحديث الصفحة بـ preventDefault. الخطوة التالية: انتقل الآن إلى الدرس رقم 18 «ذاكرة المكون عبر useState وقواعد الخطافات» لمواصلة البناء التراكمي المتدرج في مسار React الحديث.

مشاركة

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

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

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

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 SyntheticEvent الحدث الاصطناعي الموحد
غلاف موحد توفره React حول حدث المتصفح الأصلي لضمان تطابق الخصائص والدوال عبر كافة المتصفحات.
للمراجعة
02 Event Bubbling صعود الحدث
انتقال الحدث تصاعدياً من العنصر الفرعي المنقور إلى معالجات العناصر الأب والأسلاف في شجرة الواجهة.
للمراجعة
03 Capture Phase مرحلة الالتقاط التنازلي
المرحلة الأولى التي ينزل فيها الحدث من الجذر نحو العنصر الهدف وتُلتقط في React باللاحقة Capture.
للمراجعة
04 Default Browser Action السلوك الافتراضي للمتصفح
الإجراء التلقائي المدمج بالمتصفح مثل إعادة تحميل الصفحة عند إرسال نموذج والذي نلغيه بدالة preventDefault.
للمراجعة

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

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

الاختصارات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 W3C W3C
World Wide Web Consortium
منظمة معايير الويب العالمية التي يلتزم كائن SyntheticEvent في React بمواصفات الأحداث القياسية الصادرة عنها.
للمراجعة
02 SPA SPA
Single-Page Application
معمارية تطبيقات تعتمد على منع إعادة تحميل الصفحة الكاملة لمعالجة النماذج والانتقالات بسلاسة.
للمراجعة
03 DOM DOM
Document Object Model
شجرة عناصر المستند الحية التي يمكن قراءة حدثها الأصلي المباشر عبر خاصية e.nativeEvent.
للمراجعة
04 API API
Application Programming Interface
واجهة الدوال والخصائص القياسية المتاحة على كائن الحدث للتحكم الدقيق في مساره وسلوكه.
للمراجعة

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

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

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

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

0/2مهام منجزة
  1. افتح مثال انتشار الأحداث في محرر التجريب، وانقر كلا الزرين للتحقق من أن e.stopPropagation() يمنع ظهور خطوة البطاقة الأب.

  2. افتح مثال نموذج البحث في محرر التجريب، واكتب كلمة مفتاحية ثم اضغط Enter ولاحظ بقاء الواجهة دون إعادة تحميل.

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

مساحة التحدي

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

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

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

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

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

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

ما الدالة التي تمنع نقرة زر فرعي من تشغيل معالج onClick الخاص بالبطاقة الأب الحاضنة له؟

توقف دالة e.stopPropagation() صعود الحدث إلى معالجات العناصر الأب في الشجرة.

02

ما الدالة التي تمنع المتصفح من إعادة تحميل الصفحة بالكامل عند إرسال عنصر <form>؟

تلغي الدالة e.preventDefault() السلوك الافتراضي للمتصفح المتمثل في إعادة تحميل الصفحة.

03

إذا احتوى عنصر <button onClick={handleClick}> على وسم داخلي <strong>حفظ</strong> ونقر المستخدم فوق النص العريض، فما قيمة e.currentTarget؟

تشير e.currentTarget دائماً للعنصر الحامل للمعالج وهو <button>، بينما تشير e.target إلى العنصر الفرعي <strong>.

04

في React تصعد معظم أحداث الواجهة عبر شجرة المكونات نحو الأعلى، ويُعد الحدث onScroll استثناءً بارزاً لا يصعد للأب.

صواب؛ فأحداث النقر ولوحة المفاتيح تصعد للأب بينما يقتصر onScroll على العنصر المتمرر ذاته.

05

كيف تربط مستمع نقر في React يعمل خلال مرحلة الالتقاط التنازلي Capture قبل وصول الحدث للأبناء؟

إضافة اللاحقة Capture لاسم الخاصية مثل onClickCapture يجعلها تعمل في مرحلة النزول.

06

ما الخاصية الموجودة داخل كائن SyntheticEvent للوصول إلى حدث المتصفح الأصلي الخام عند الضرورة؟

توفر خاصية e.nativeEvent الوصول المباشر لكائن الحدث الأصلي التابع للمتصفح.

07

استدعاء الدالة e.preventDefault() يوقف صعود الحدث إلى المكونات الأب تلقائياً أيضاً.

خطأ؛ فدالة preventDefault تلغي السلوك الافتراضي للمتصفح فقط ولا توقف انتشار الحدث صعوداً.

08

في React 18 الحديثة، تُفوض الأحداث مركزياً على حاوية الجذر التي أنشأتها createRoot بدلاً من تعليق مستمع منفصل لكل عنصر.

صواب؛ فالتفويض المركزي على حاوية الجذر يحسن استهلاك الذاكرة ويوحد سلوك الشجرة.

09

ما الترتيب الزمني الصحيح لمراحل تنفيذ الحدث عند النقر على زر فرعي داخل حاوية أب؟

تعمل معالجات الالتقاط Capture نزولاً أولاً، ثم معالج الهدف، ثم معالجات الصعود Bubbling نحو الأعلى.

10

لماذا تغلف مكتبة React أحداث المتصفح الأصلية داخل كائن SyntheticEvent؟

لتوحيد خصائص وسلوك الأحداث قياسياً عبر كافة المتصفحات وأنظمة التشغيل المختلفة.