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

قواعد كتابة JSX وتجميع العناصر عبر FragmentWriting Markup with JSX and Fragments

افهم كيف تترجم صياغة JSX إلى كائنات عناصر React، وطبق قاعدة العنصر الجذري الواحد وتجميع العناصر المتجاورة عبر Fragment، وإغلاق الوسوم المفردة وكتابة السمات بصيغة camelCase.
أقسام الدرس
6
الأمثلة
3
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

لا تفهم المتصفحات صياغة JSX بصورتها الخام مباشرة؛ إذ يتولى مجمع الكود في Vite أو Babel ترجمة كل وسم تكتبه إلى استدعاء دالي قياسي يُنشئ كائنات JavaScript وصفية خفيفة في الذاكرة تحدد نوع العنصر وخصائصه.

ولأن كل وسم JSX يتحول في الحقيقة إلى تعبير برمجي يُنتج كائناً، فإن قواعد كتابته أكثر دقة وصرامة من محلل HTML المتسامح في المتصفح.

القاعدة الأولى في كتابة JSX هي قاعدة العنصر الجذري الواحد (Single Root Rule)؛ فلا يجوز للدالة إرجاع وسمين متجاورين في المستوى الأعلى مباشرة دون عنصر أب يجمعهما. والسبب البرمجي بسيط: دالة JavaScript لا تستطيع أن تُعيد عبر return سوى قيمة كائنية واحدة فقط في المرة الواحدة.

قد يفي وضع غلاف <div> بالغرض أحياناً، لكن إقحام <div> زائد بين خلايا الجداول أو قوائم التعريف <dl> أو عناصر شبكات Flexbox وGrid يفسد دلالة الصفحة ويكسر توزيع الأعمدة فوراً!

تعالج React هذه المشكلة بأناقة عبر مكون التجميع Fragment؛ إذ تستخدم الصيغة المختصرة <>...</> أو الصيغة الصريحة <Fragment> لتجميع العناصر المتجاورة دون إضافة أي عقدة زائدة في شجرة المتصفح.

مقارنة بصرية بين تلوث شجرة DOM بغلاف div زائد وبين التجميع النقي عبر Fragment دون عقد إضافية
HTML
function TermPair() {
  return (
    <>
      <dt><strong>Fragment</strong></dt>
      <dd>Zero extra DOM wrapper node.</dd>
    </>
  );
}

function GlossaryCard() {
  return <dl className="rx-card"><TermPair /></dl>;
}

تنص القاعدة الثانية في JSX على الإغلاق الصريح لكافة الوسوم بلا استثناء. فبينما يتسامح HTML التقليدي مع ترك العناصر الفارغة مفتوحة، يشترط مترجم JSX إنهاء كل وسم مفرد بشرطة مائلة صريحة مثل <img /> و<input /> و<br /> و<hr /> وإلا توقف التجميع بخطأ نحوي فوري.

HTML
function WorkspaceShowcase() {
  return (
    <figure className="rx-card">
      <img
        src="/images/examples/studio-workspace.webp"
        alt="Modern workspace"
      />
      <hr />
      <figcaption>Closed void tags.</figcaption>
    </figure>
  );
}

تحوّل القاعدة الثالثة سمات العناصر المركبة والمحجوزة إلى صيغة camelCase لأن سمات JSX تتحول برمجياً إلى مفاتيح في كائنات JavaScript وخصائص DOM:

  • تُكتب className بدلاً من class، وتُكتب htmlFor في وسم التسمية بدلاً من for.
  • تُكتب السمات المركبة بحروف متصلة مثل tabIndex وreadOnly وmaxLength وstrokeWidth.
  • استثناء مهم: تحتفظ سمات الوصولية القياسية aria-* والسمات المخصصة data-* بالشرطة الوسطية كما في aria-label.
HTML
function SearchField() {
  return (
    <div className="rx-card">
      <label htmlFor="courseQuery">Track Name</label>
      <input
        id="courseQuery" readOnly
        defaultValue="React 18"
        aria-describedby="queryHint"
      />
    </div>
  );
}

أخيراً، كيف نكتب التعليقات التوضيحية داخل JSX؟ خارج الوسوم تعمل تعليقات JavaScript المعتادة بصورة طبيعية، أما بداخل محتوى العناصر فإن كتابة // مباشرة تظهر كنص مرئي للمستخدم على الشاشة! لذلك تُكتب التعليقات داخل الوسوم محاطة بأقواس معقوفة وعلامتي تعليق الكتلة هكذا: {/* تعليق توضيحي */}. يلخص الجدول التالي قواعد التحويل من HTML إلى JSX:

الخاصية النحويةلغة HTML5 التقليديةصياغة React JSX الحديثة
تعدد العناصر بالجذرمسموح بوجود عدة عناصر متجاورة مباشرةيشترط جذر واحد أو التجميع عبر <>...</>
إغلاق الوسوم الفارغةالإغلاق اختياري مثل <img> و<br>إغلاق ذاتي إلزامي بالشرطة مثل <img /> و<br />
سمات التنسيق والتسميةتُكتب class="card" وfor="emailBox"تُكتب className="card" وhtmlFor="emailBox"
التعليقات داخل البنيةتُكتب بصيغة <!-- تعليق -->تُكتب بصيغة {/* تعليق */}
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

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

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

فهمت في هذا الدرس كيف تتحول JSX إلى كائنات عناصر React، وطبقت قاعدة الجذر الواحد بنظافة عبر مكون Fragment دون عقد زائدة، والتزمت بإغلاق الوسوم المفردة وتحويل السمات إلى camelCase وكتابة التعليقات داخل الأقواس المعقوفة. الخطوة التالية: انتقل الآن إلى الدرس رقم 8 «تعابير JavaScript والحماية من XSS داخل JSX» لمواصلة البناء التراكمي المتدرج في مسار React الحديث.

مشاركة

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

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

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

المصطلحات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 React Fragment مكون التجميع Fragment
حاوية منطقية مدمجة في React تجمع عدة عناصر متجاورة في جذر واحد دون إضافة أي وسم زائد لشجرة المتصفح.
للمراجعة
02 Single Root Rule قاعدة الجذر الواحد
القاعدة التي تلزم كل مكون بإرجاع عنصر أب خارجي واحد أو Fragment يضم بقية العناصر بداخله.
للمراجعة
03 Void Element الوسم المفرد الفارغ
عنصر لا يقبل محتوى داخلياً مثل img وinput وbr ويجب إغلاقه ذاتياً بالعلامة /> في صياغة JSX.
للمراجعة
04 camelCase Attribute سمة بصيغة camelCase
كتابة أسماء خصائص العناصر المركبة بحرف صغير للكلمة الأولى وكبير لما بعدها مثل className وhtmlFor.
للمراجعة

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

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

الاختصارات4

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

0 / 4 مفهومةأول بطاقة، أول خطوة
01 JSX JSX
JavaScript XML
امتداد نحوي يترجمه المجمع إلى استدعاءات برمجية تنشئ كائنات عناصر React.
للمراجعة
02 DOM DOM
Document Object Model
شجرة عناصر المتصفح الحية التي يحميها مكون Fragment من التلوث بعقد حاوية غير ضرورية.
للمراجعة
03 ARIA ARIA
Accessible Rich Internet Applications
معيار سمات سهولة الوصول التي تحتفظ بالشرطة الوسطية كما هي داخل عناصر JSX.
للمراجعة
04 XML XML
Extensible Markup Language
نموذج التوصيف الصارم في موازنة وإغلاق الوسوم الذي استوحت منه JSX قواعد الإغلاق الذاتي.
للمراجعة

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

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

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

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

0/2مهام منجزة
  1. افتح مثال قائمة المصطلحات في محرر التجريب وأضف زوجاً ثالثاً من الوسمين dt وdd داخل صيغة <>...</> المختصرة دون أي غلاف div.

  2. افتح مثال حقل البحث في محرر التجريب وأضف تعليقاً بصيغة {/* */} فوق الحقل وتأكد من عمل النقر على التسمية عبر htmlFor.

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

مساحة التحدي

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

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

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

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

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

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

إلى ماذا يحوّل مجمع الكود مثل Vite أو Babel وسوم JSX قبل تشغيلها في المتصفح؟

تُترجم وسوم JSX إلى استدعاءات دوال قياسية تنشئ كائنات JavaScript خفيفة تصف عناصر الواجهة.

02

لماذا لا يجوز إرجاع عنصرين متجاورين مباشرة في المستوى الأعلى لجملة return بدون غلاف يجمعهما؟

لأن دالة JavaScript لا تستطيع أن تعيد سوى قيمة كائنية واحدة فقط في جملة الإرجاع.

03

ما الميزة الجوهرية لتجميع العناصر المتجاورة عبر <>...</> بدلاً من إحاطتها بوسم <div> إضافي؟

يجمع Fragment العناصر برمجياً دون إضافة أي عقدة حاوية زائدة في شجرة DOM الحقيقية.

04

في صياغة JSX يجب إغلاق كافة الوسوم المفردة الفارغة مثل <img /> و<br /> بشرطة مائلة صريحة.

صواب؛ فترك أي وسم مفرد دون إغلاق ذاتي يوقف المترجم بخطأ نحوي فوري.

05

ما البديلان الصحيحان في JSX لسمتي class وfor التقليديتين في HTML؟

تعتمد JSX الخاصيتين className وhtmlFor المطابقتين لخصائص كائنات DOM القياسية.

06

تحتفظ سمات الوصولية aria-* والسمات المخصصة data-* بالشرطة الوسطية كما هي داخل JSX مثل aria-label.

صواب؛ تُعد سمات aria-* وdata-* استثناءً رسمياً متعمداً وتُكتب بالشرطة القياسية.

07

كيف تكتب تعليقاً برمجياً داخل عناصر JSX بحيث لا يظهر كنص مرئي على الشاشة؟

يُكتب التعليق محاطاً بأقواس معقوفة وعلامتي تعليق الكتلة بصيغة {/* نص التعليق */}.

08

متى نحتاج لاستيراد المكون الصريح { Fragment } من مكتبة react بدلاً من الاختصار <>...</>؟

نستخدم <Fragment> الصريح عندما نحتاج لتمرير سمة مثل key إلى التجميعة في القوائم.

09

مع محول JSX الحديث في React 18 وأداة Vite، لست مضطراً لكتابة import React from "react" في أعلى كل ملف لمجرد كتابة وسوم الواجهة.

صواب؛ إذ يدرج المجمع الحديث دالة تحويل JSX تلقائياً خلف الكواليس.

10

كيف تُكتب سمة ترتيب التركيز tabindex في صياغة JSX القياسية؟

تُكتب بصيغة camelCase بحرف I كبير هكذا tabIndex={0}.