الدرس العاشر: المكونات المركبة (Nested Components) في React
في هذا الدرس، سنتناول كيفية إنشاء مكونات متداخلة (Nested Components) في React، وكيفية تمرير props بين المكونات المتداخلة، بالإضافة إلى كيفية بناء واجهات معقدة باستخدام مكونات متعددة. تعتبر المكونات المتداخلة من أهم مفاهيم React لأنها تتيح لك بناء تطبيقات ديناميكية وقابلة للتوسعة بسهولة.
1. كيف تنشئ مكونات متداخلة في React؟
في React، يمكننا إنشاء مكونات داخل مكونات أخرى بسهولة. هذا يُعرف بـ المكونات المتداخلة أو المكونات الفرعية، حيث تعمل المكونات الصغيرة معًا لتكوين واجهات مستخدم أكبر وأكثر تعقيدًا.
مثال بسيط لإنشاء مكونات متداخلة:
import React from 'react';
// المكون الفرعي - عنصر فردي في القائمة
function Item({ name }) {
return <li>{name}</li>;
}
// المكون الرئيسي - يعرض قائمة من العناصر
function ItemList() {
const items = ['Apple', 'Banana', 'Orange', 'Mango'];
return (
<ul>
{items.map((item, index) => (
<Item key={index} name={item} /> // تمرير prop للمكون الفرعي
))}
</ul>
);
}
export default ItemList;
في هذا المثال:
- مكون
Itemهو مكون فرعي يعرض كل عنصر في القائمة. - مكون
ItemListهو المكون الرئيسي الذي يحتوي على القائمة الكاملة. - نستخدم
map()في المكون الرئيسي لإعادة استخدام المكون الفرعيItemلعرض كل عنصر.
الشرح:
ItemListهو المكون الأساسي الذي يحتوي على قائمة من العناصر.- نمرر خاصية
nameللمكون الفرعيItemباستخدام props، وفي هذا المثال، يكون prop هو اسم العنصر في القائمة.
2. كيفية تمرير props بين المكونات المتداخلة؟
في React، props هي الطريقة الرئيسية لتمرير البيانات بين المكونات. المكونات الفرعية يمكنها استقبال props من المكونات الرئيسية.
مثال على تمرير props بين المكونات المتداخلة:
import React from 'react';
// مكون فرعي يعرض رسالة الترحيب
function WelcomeMessage({ name }) {
return <h1>Welcome, {name}!</h1>;
}
// المكون الرئيسي - يعرض رسالة الترحيب
function App() {
return <WelcomeMessage name="John" />; // تمرير prop للمكون الفرعي
}
export default App;
في هذا المثال:
Appهو المكون الرئيسي الذي يمررnameكمُدخل للمكون الفرعيWelcomeMessage.- المكون
WelcomeMessageيستقبل prop يسمىnameويعرضه داخل عنصر<h1>.
الشرح:
- المكونات في React تعتمد بشكل أساسي على props لتبادل البيانات. المكونات الفرعية تستقبل props من المكونات الأم.
- يمكن تمرير المصفوفات أو الكائنات كـ props أيضًا، وليس فقط القيم البسيطة.
3. كيفية بناء واجهات معقدة باستخدام مكونات متعددة؟
بناء واجهات معقدة في React يتطلب تقسيم هذه الواجهة إلى مكونات صغيرة ومتعددة. كل مكون صغير يمكنه التعامل مع جزء من الواجهة، مما يجعل الكود أكثر قابلية لإعادة الاستخدام وأسهل في الصيانة.
مثال على واجهة معقدة باستخدام مكونات متعددة:
import React from 'react';
// مكون فرعي لعرض صورة
function Image({ url, alt }) {
return <img src={url} alt={alt} />;
}
// مكون فرعي لعرض عنوان
function Title({ text }) {
return <h2>{text}</h2>;
}
// مكون فرعي لعرض وصف
function Description({ text }) {
return <p>{text}</p>;
}
// المكون الرئيسي - يعرض مكونات فرعية متعددة
function ProfileCard() {
const user = {
name: 'John Doe',
description: 'Web Developer',
imageUrl: 'https://example.com/john.jpg',
};
return (
<div>
<Image url={user.imageUrl} alt="John Doe" />
<Title text={user.name} />
<Description text={user.description} />
</div>
);
}
export default ProfileCard;
في هذا المثال:
- مكونات فرعية مثل
ImageوTitleوDescriptionتتعامل مع جزء صغير من واجهة المستخدم. - مكون
ProfileCardهو المكون الرئيسي الذي يدمج هذه المكونات الفرعية لتشكيل واجهة معقدة.
الشرح:
ProfileCardيستخدم المكونات الفرعية لعرض صورة، عنوان، ووصف باستخدام props.- هذه الطريقة تجعل المكونات قابلة لإعادة الاستخدام بسهولة. إذا أردت استخدام نفس المكونات في أماكن مختلفة، يمكنك فقط تمرير props جديدة لكل مكون.
4. التعامل مع المكونات المتداخلة وحالات التحديث
عند العمل مع المكونات المتداخلة، قد يكون هناك حالات حيث يحتاج مكون فرعي إلى تعديل state في مكون آخر. في هذه الحالة، يمكننا استخدام callbacks (دوال رد الفعل) لتمرير التحديثات من المكونات الفرعية إلى المكونات الرئيسية.
مثال على استخدام callbacks لتحديث الحالة في المكونات المتداخلة:
import React, { useState } from 'react';
// مكون فرعي - عرض عدد النقرات
function Counter({ count, onClick }) {
return (
<div>
<p>Clicked {count} times</p>
<button onClick={onClick}>Click me</button>
</div>
);
}
// المكون الرئيسي - إدارة عدد النقرات
function App() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1); // تحديث الحالة عند النقر على الزر
};
return <Counter count={count} onClick={handleClick} />;
}
export default App;
في هذا المثال:
Counterهو مكون فرعي يستقبلcountوonClickكـ props.Appهو المكون الرئيسي الذي يدير حالةcountويقوم بتمريرها إلى المكون الفرعيCounter، بالإضافة إلى تمرير دالةhandleClickكـ callback ليتم تنفيذها عندما ينقر المستخدم على الزر.
الشرح:
- في هذا السيناريو، المكون الفرعي
Counterلا يتعامل مع الحالة مباشرةً. بدلاً من ذلك، يقوم بتمرير الدالةonClickإلى المكون الأمAppللتعامل مع التحديثات. - هذه هي الطريقة الشائعة لتمرير التحديثات بين المكونات المتداخلة في React.
5. الختام
في هذا الدرس:
- تعلمنا كيفية إنشاء مكونات متداخلة في React، حيث يتم استخدام مكونات صغيرة لبناء واجهات مستخدم أكثر تعقيدًا.
- استعرضنا كيفية تمرير props بين المكونات المتداخلة لتمرير البيانات بين المكونات الأم والفرعية.
- تعلمنا كيفية بناء واجهات معقدة باستخدام مكونات متعددة، مما يسمح بإنشاء تطبيقات أكثر مرونة وقابلة للتوسعة.
- ناقشنا كيفية التعامل مع حالات التحديث بين المكونات باستخدام callbacks، مما يتيح للمكونات الفرعية التأثير على الحالة في المكونات الأم.
إتقان المكونات المتداخلة هو خطوة أساسية نحو بناء تطبيقات React قوية وقابلة لإعادة الاستخدام.
اكتشاف المزيد من كود التطور
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.


