في هذا الدرس 6تصفّح المواضيع
لا تفرض React لغة تنسيق مغلقة خاصة بها، بل تستثمر خبرتك الأصيلة في CSS بالكامل! الأسلوب الأساسي الأوسع انتشاراً هو كتابة ملف تنسيق خارجي يُستورد في مشاريع Vite عبر import './TrackCard.css' وربطه بالعناصر باستخدام خاصية className.
تمنحك ملفات التنسيق الخارجية كافة قدرات CSS الأصيلة: التخزين المؤقت في المتصفح، وحالات التفاعل مثل :hover و:focus-visible، واستعلامات الشاشات المتجاوبة @media، ومتغيرات الألوان للوضعين الفاتح والداكن.
// TrackCard.jsx (uses classes from TrackCard.css)
function TrackCard() {
return (
<article className="studio-feature-card">
<span className="rx-badge">Stylesheet CSS</span>
<h3 className="feature-title">Responsive UI</h3>
<p>Supports :hover, :focus, and @media.</p>
</article>
);
}
عندما تعتمد قيمة بصرية على حساب رقمي متغير وقت التشغيل—مثل عرض شريط تقدم بالنسبة المئوية أو ارتفاع عمود بياني—نمرر كائن JavaScript إلى خاصية style بالصيغة style={{ width: '75%', backgroundColor: '#7750b2' }}.
لاحظ أنه لا يوجد سر خاص في القوسين المزدوجين {{ }}؛ فالقوس الخارجي يفتح تعبير JSX المعتاد، والقوس الداخلي يمثل كائناً برمجياً تُكتب مفاتيحه بصيغة camelCase بدلاً من الشرطة الوسطية.
function MasteryMeter() {
const pct = 82;
const fill = {
width: `${pct}%`,
height: 12,
backgroundColor: '#7750b2',
};
return (
<div className="rx-card"><div style={fill} /></div>
);
}
لتبديل المظهر البصري تبعاً لحالة المكون—كتمييز التبويب النشط أو البطاقة المميزة أو تنبيه التحذير—تجنب تكرار كائنات التنسيق الطويلة، وركّب سلسلة كلاسات شرطية بنظافة عبر القوالب النصية `card ${isFeatured ? 'is-featured' : ''}` أو بتصفية مصفوفة الكلاسات عبر filter(Boolean).join(' ').
function BuildStatusBanner() {
const passed = true;
const cls = [
'status-banner',
passed && 'is-online',
].filter(Boolean).join(' ');
return (
<div className={cls}>All 10 Gates Passed</div>
);
}
في المشاريع الكبيرة متعددة المطورين، قد يعرّف اثنان في ملفين منفصلين كلاساً باسم .card فيطغى أحدهما على الآخر في النطاق العام للمتصفح! تحل وحدات التنسيق المعزولة (CSS Modules) هذه المعضلة تلقائياً في Vite دون تثبيت أي حزمة إضافية؛ يكفي تسمية الملف بامتداد CourseCard.module.css واستيراده ككائن import styles from './CourseCard.module.css'.
وعند كتابة className={styles.card}، يولّد المجمع اسماً فريداً مشفراً مثل _card_7x92b_1 يمنع تصادم الأسماء نهائياً!
لبناء مكونات احترافية تخدم الواجهات العربية (RTL) والإنجليزية (LTR) بنفس الكفاءة، تجنب الخصائص الفيزيائية الجامدة مثل margin-left وborder-left التي تنكسر عند عكس اتجاه الصفحة! اعتمد دائماً الخصائص المنطقية (CSS Logical Properties) مثل padding-inline وmargin-inline-start وborder-inline-start (أو صيغتها المضمنة borderInlineStart) لينعكس تصميم المكون تلقائياً بانسجام تام في كلتا اللغتين.
function BilingualCallout() {
return (
<div className="rx-stack">
<div dir="ltr" className="logical-note">
LTR Start Edge
</div>
<div dir="rtl" className="logical-note">
RTL Start Edge
</div>
</div>
);
}
في هندسة واجهات الإنتاج الاحترافية، نادراً ما تعتمد على أداة واحدة بمعزل عن غيرها؛ فالنهج الأمثل يجمع متغيرات التصميم العامة للألوان والسمات، مع CSS Modules أو ملفات الكلاسات لتنسيق البنية وحالات التفاعل والتجاوب، مع حصر كائن style المضمن في الأبعاد والنسب المحسوبة لحظياً فقط. قارن بين الأساليب في المصفوفة التالية:
| أسلوب التنسيق | نقطة القوة الأساسية | القيد الهندسي أو ضابط الاستخدام |
|---|---|---|
ملفات CSS عبر className | دعم كامل لـ :hover و@media والتخزين المؤقت | نطاق الأسماء عام وقد يتصادم في المشاريع الضخمة |
وحدات *.module.css | عزل تلقائي للأسماء بتوليد لاحقة فريدة في Vite | تُستورد ككائن styles مخصص لكل مكون |
كائن style={{}} المضمن | مثالي للنسب المئوية والإحداثيات المحسوبة لحظياً | لا يدعم :hover ولا استعلامات الشاشات @media |
| الخصائص المنطقية Logical CSS | انعكاس تلقائي متقن بين الإنجليزية والعربية RTL | استبدال الاتجاهات الفيزيائية بـ inline-start |
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
نسّقت في هذا الدرس مكونات React عبر ملفات CSS وخاصية className، وكتبت كائنات style المضمنة بصيغة camelCase، وركّبت الكلاسات الشرطية بأمان، وعزلت الأسماء بوحدات CSS Modules، ودعمت الواجهات العربية والإنجليزية بالخصائص المنطقية. الخطوة التالية: انتقل الآن إلى الدرس رقم 10 «تمرير البيانات إلى المكونات عبر Props» لمواصلة البناء التراكمي المتدرج في مسار React الحديث.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 CSS Modules وحدات CSS المعزولة
- ملفات تنسيق بامتداد *.module.css يحوّل المجمع أسماء كلاساتها إلى معرّفات فريدة لمنع تصادم التنسيقات بين المكونات.
- للمراجعة
- 02 Inline Style Object كائن التنسيق المضمن
- كائن JavaScript بمفاتيح camelCase يُمرر لخاصية style لضبط القيم المحسوبة ديناميكياً وقت التشغيل.
- للمراجعة
- 03 CSS Logical Properties الخصائص المنطقية في CSS
- خصائص تنسيق تعتمد بداية ونهاية اتجاه القراءة بدلاً من اليمين واليسار الثابتين فتدعم العربية والإنجليزية تلقائياً.
- للمراجعة
- 04 Conditional Class String سلسلة الكلاسات الشرطية
- تشكيل قيمة className ديناميكياً بحسب حالة المكون عبر القوالب النصية أو مصفوفة مفلترة بالقيم الصحيحة.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 CSS CSS
- Cascading Style Sheets
- لغة التنسيق القياسية المعتمدة مع خاصية className ووحدات CSS Modules ومتغيرات السمات.
- للمراجعة
- 02 RTL RTL
- Right-to-Left
- اتجاه تخطيط الواجهات من اليمين إلى اليسار للغة العربية، المدعوم بسلاسة عبر الخصائص المنطقية.
- للمراجعة
- 03 LTR LTR
- Left-to-Right
- اتجاه تخطيط الواجهات من اليسار إلى اليمين في اللغات اللاتينية كالإنجليزية.
- للمراجعة
- 04 BEM BEM
- Block Element Modifier
- منهجية تسمية كلاسات تقليدية لمنع التضارب تغني عنها غالباً آلية العزل التلقائي في CSS Modules.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
افتح مثال شريط التقدم في محرر التجريب وغيّر قيمة المتغير completionPct من 82 إلى 45 وراقب تحديث النص وعرض الشريط معاً.
-
افتح مثال التنبيه ثنائي الاتجاه وتأكد كيف يضع كلاس .logical-note الواحد الشريط الملون في بداية السطر تلقائياً لكل من الإنجليزية والعربية.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي10 أسئلة تنتظرك +
كيف تُكتب أسماء خصائص CSS المركبة مثل background-color داخل كائن style المضمن في React؟
بما أن style يستقبل كائن JavaScript، تُكتب الخصائص المركبة بصيغة camelCase مثل backgroundColor.
ماذا يمثل القوسان المعقوفان المزدوجان في التعبير style={{ padding: 16 }} برمجياً؟
القوس الخارجي يفتح تعبير JavaScript في JSX، والداخلي يمثل كائناً برمجياً قياسياً Object Literal.
تدعم ملفات CSS الخارجية المربوطة بـ className حالات :hover و:focus-visible واستعلامات @media بينما لا تدعمها كائنات style المضمنة.
صواب؛ فالحالات التفاعلية واستعلامات الشاشات تتطلب محرك محددات CSS ولا تعمل عبر خاصية العنصر المباشرة.
ما المشكلة الهندسية التي تحلها ملفات CSS Modules بامتداد *.module.css تلقائياً في مشاريع Vite؟
تولّد أسماء كلاسات فريدة معزولة لكل ملف مكون فتمنع تصادم وتداخل الأسماء في النطاق العام.
لماذا يُعد استخدام filter(Boolean).join(" ") أكثر أماناً من وضع && مباشرة داخل قالب نصي لخاصية className؟
لأن عدم تحقق الشرط داخل القالب النصي يطبع كلمة "false" حرفياً كاسم كلاس غير مرغوب في المتصفح.
أي خاصية CSS منطقية تضع الحد الجانبي تلقائياً على اليسار في الإنجليزية وعلى اليمين في العربية؟
تتكيف خاصية border-inline-start آلياً مع اتجاه بداية السطر في كلتا اللغتين.
عند تمرير رقم لخاصية أبعاد مثل height: 14 في كائن style تضيف React وحدة px تلقائياً مع إبقاء خصائص مثل opacity وzIndex بدون وحدة.
صواب؛ تميز React بين خصائص الأطوال البعدية وبين الخصائص الرقمية اللابعدية تلقائياً.
تتطلب أداة Vite تثبيت خمس إضافات خارجية يدوياً قبل أن تعمل ملفات *.module.css في مشروع React.
خطأ؛ تدعم أداة Vite ملفات *.module.css مدمجاً منذ اللحظة الأولى دون أي إعدادات إضافية.
متى يكون استخدام كائن style={{ ... }} المضمن الاختيار الهندسي الصحيح داخل مكون React؟
يُخصَّص كائن style المضمن للقيم الرقمية المحسوبة ديناميكياً وقت التشغيل كالنسب المئوية والإحداثيات الحية.
كيف تطبق الكلاس .cardBox المستورد عبر import styles from "./Panel.module.css" على عنصر في JSX؟
تُمرر الخاصية المقابلة من الكائن المستورد داخل المعقوفات عبر className={styles.cardBox}.