المكوّنات الوظيفية وProps
أنشئ المكوّنات كدوال، واقبل props وفكّكها، واستخدم PropTypes أو أنواع TypeScript لتوثيق أشكال البيانات المتوقعة.
المكوّنات الوظيفية وProps درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ما مكوّن React؟
مكوّن React هو دالة JavaScript تُعيد JSX. والمكوّنات هي اللبنات الأساسية لتطبيقات React، وهي أجزاء واجهة مستخدم قابلة لإعادة الاستخدام والتركيب.
function Welcome() {
return <h1>Welcome to CoddyKit!</h1>;
}
// Arrow function style:
const Welcome = () => <h1>Welcome to CoddyKit!</h1>;Props — تمرير البيانات إلى الأسفل
تُستخدم props (الخصائص) لتمرير البيانات من المكوّن الأب إلى المكوّن الابن. ويتلقاها المكوّن في وسيطته الأولى على هيئة كائن عادي.
function Greeting({ name, role }: { name: string; role: string }) {
return <p>Hello, {name}! Your role is {role}.</p>;
}
// Usage:
<Greeting name="Alice" role="admin" />واجهة TypeScript لـ props
عرّف واجهة مُسمّاة لـ props للحصول على الإكمال التلقائي وفحص الأنواع والتوثيق.
interface ButtonProps {
label: string;
onClick: () => void;
disabled?: boolean;
variant?: 'primary' | 'secondary' | 'ghost';
}
function Button({ label, onClick, disabled = false, variant = 'primary' }: ButtonProps) {
return (
<button
onClick={onClick}
disabled={disabled}
className={`btn btn-${variant}`}
>
{label}
</button>
);
}الخاصية children
تحتوي الخاصية children على المحتوى الموجود بين وسمَي فتح المكوّن وإغلاقه. اكتب نوعها على أنه React.ReactNode لقبول أي محتوى قابل للعرض.
interface CardProps {
title: string;
children: React.ReactNode;
}
function Card({ title, children }: CardProps) {
return (
<div className="card">
<h2>{title}</h2>
<div className="card-body">{children}</div>
</div>
);
}
// Usage:
<Card title="Hello">
<p>Card content goes here.</p>
</Card>القيم الافتراضية لـ props باستخدام التفكيك
عيّن القيم الافتراضية مباشرةً في نمط التفكيك. هذا هو الأسلوب الحديث؛ فلم تعد واجهة defaultProps المتوقفة موصى بها.
function Alert({ type = 'info', message, onClose }: AlertProps) {
return (
<div className={`alert alert-${type}`}>
<span>{message}</span>
<button onClick={onClose}>×</button>
</div>
);
}تركيب المكوّنات
تُركَّب المكوّنات معًا: تستخدم Page مكوّن Layout، الذي يستخدم Nav وSidebar، ويستخدم كلٌّ منهما ذرات أصغر مثل Button وIcon. تُسمّى هذه الشجرة من المكوّنات شجرة مكوّنات React.
اصطلاحات التسمية
يجب أن تبدأ أسماء المكوّنات بحرف كبير. وتُعامل الأسماء التي تبدأ بحروف صغيرة كعناصر HTML. فـ <div> هو عنصر div في HTML، بينما <Div> مكوّن React اسمه Div.
المكوّنات النقية
يكون المكوّن نقيًا إذا أعطت props نفسها دائمًا المخرجات نفسها، ولم تحدث أي آثار جانبية أثناء العرض. ويكون فهم المكوّنات النقية وتحسينها أسهل.
// Pure:
const Greeting = ({ name }: { name: string }) => <h1>Hi, {name}</h1>;
// Impure (side effect in render):
const Bad = ({ id }: { id: string }) => {
localStorage.setItem('id', id); // SIDE EFFECT in render — avoid
return <p>{id}</p>;
};تمرير الدوال كـ props
تُمرَّر الدوال (الاستدعاءات الراجعة) كـ props لتمكين المكوّنات الابنة من التواصل مع المكوّنات الأبوية. يعرّف المكوّن الأب الدالة، ويستدعيها المكوّن الابن.
function TodoItem({ text, onDelete }: { text: string; onDelete: () => void }) {
return (
<li>
{text}
<button onClick={onDelete}>Delete</button>
</li>
);
}توسيع props
يمرّر عامل التوسيع جميع props من كائن إلى مكوّن. وهذا مفيد للمكوّنات المغلِّفة أو الممرِّرة، لكن استخدمه بحذر؛ فقد تمرّر props غير متوقعة.
function InputWrapper(props: React.InputHTMLAttributes<HTMLInputElement>) {
return <input {...props} className={`input-base ${props.className || ''}`} />;
}Fragment والمفاتيح في سياق props
عند عرض قائمة من المكوّنات بوصفها عناصر فرعية، يجب أن يحتوي كل منها على prop فريد باسم key. تساعد المفاتيح React على تحديد العناصر التي تغيّرت أو أُضيفت أو أُزيلت.
اختبار سريع
كيف توفّر قيمة افتراضية لـ prop في مكوّن دالة حديث في React؟
مراجعة: المكوّنات وprops
المكوّنات الوظيفية هي دوال JavaScript تُعيد JSX. تمرّر props البيانات من المكوّن الأب إلى الابن. استخدم واجهات TypeScript لتحديد أنواع props. استخدم children: React.ReactNode لمحتوى الفتحات. حدّد القيم الافتراضية أثناء التفكيك. مرّر الاستدعاءات الراجعة كـ props للتواصل من الابن إلى الأب. يجب أن تبدأ الأسماء بحروف كبيرة.
الأسئلة الشائعة
هل درس «المكوّنات الوظيفية وProps» مجاني؟
نعم — نص درس «المكوّنات الوظيفية وProps» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «المكوّنات الوظيفية وProps»؟
أنشئ المكوّنات كدوال، واقبل props وفكّكها، واستخدم PropTypes أو أنواع TypeScript لتوثيق أشكال البيانات المتوقعة. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «المكوّنات الوظيفية وProps»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- JSX: الصياغة والتحويل
- المكوّنات الوظيفية وProps
- خطاف useState: الحالة وإعادة التصيير
- القوائم والمفاتيح والتصيير الشرطي