مكوّنات قابلة لإعادة الاستخدام: props
مكوّنٌ واحد يخدم حالاتٍ كثيرة بتمرير البيانات. ⏱ نحو 35 دقيقة.
- تبني مكوّنًا واحدًا يُعاد استخدامه ببياناتٍ مختلفة عبر
props. - تستخدم القيَم الافتراضية والعرض الشرطيّ.
- تستخدم
childrenلمكوّنات التغليف.
١لماذا props؟
تكرار الكود عدوّ الصيانة. بدل كتابة بطاقة منتجٍ ثلاث مرّات، نكتب مكوّنًا واحدًا يستقبل بياناتٍ مختلفة عبر props (الخصائص) — تمامًا كما في React. المكوّن قالبٌ، وprops تملؤه:
import { View, Text, StyleSheet } from 'react-native'; function ProductCard({ name, price }) { // props: name و price return ( <View style={styles.card}> <Text style={styles.name}>{name}</Text> <Text style={styles.price}>{price} ر.س</Text> </View> );} export default function App() { return ( <View style={{ padding: 10, gap: 8 }}> <ProductCard name="قهوة مختصة" price={24} /> <ProductCard name="شاي أخضر" price={14} /> <ProductCard name="عصير برتقال" price={16} /> </View> );} const styles = StyleSheet.create({ card: { backgroundColor: '#FFF3E0', padding: 14, borderRadius: 12, flexDirection: 'row', justifyContent: 'space-between' }, name: { fontSize: 16, fontWeight: 'bold' }, price: { color: '#E8820C', fontWeight: 'bold' },});
مكوّنٌ واحد، ثلاث بطاقات. لتغيير التصميم تعدّل مكانًا واحدًا.
٢قيمٌ افتراضية و props منطقية
يمكن إعطاء قيمةٍ افتراضية، وتمرير منطق شرطيّ (مثل وسم «جديد»):
import { View, Text, StyleSheet } from 'react-native'; function Badge({ label, color = '#2E7D32' }) { return <Text style={[styles.badge, { backgroundColor: color }]}>{label}</Text>;} function Item({ name, isNew }) { return ( <View style={styles.row}> <Text style={styles.name}>{name}</Text> {isNew && <Badge label="جديد" />} </View> );} export default function App() { return ( <View style={{ padding: 12, gap: 8 }}> <Item name="سمّاعات" isNew={true} /> <Item name="غطاء هاتف" isNew={false} /> </View> );} const styles = StyleSheet.create({ row: { flexDirection: 'row', alignItems: 'center', gap: 8 }, name: { fontSize: 16 }, badge: { color: 'white', paddingHorizontal: 8, paddingVertical: 2, borderRadius: 10, overflow: 'hidden', fontSize: 12 },});
color له قيمةٌ افتراضية. والوسم يظهر فقط إن كان isNew صحيحًا (عرضٌ شرطيّ بـ &&).
٣props للأبناء: children
prop خاصّ اسمه children يمثّل ما تضعه بين وسمَي المكوّن — مفيدٌ لمكوّنات التغليف مثل «بطاقة»:
import { View, Text, StyleSheet } from 'react-native'; function Card({ title, children }) { return ( <View style={styles.card}> <Text style={styles.title}>{title}</Text> {children} </View> );} export default function App() { return ( <Card title="الملف الشخصيّ"> <Text>الاسم: نورة</Text> <Text>المدينة: الرياض</Text> </Card> );} const styles = StyleSheet.create({ card: { margin: 12, padding: 14, borderRadius: 12, borderWidth: 1, borderColor: '#E8820C' }, title: { fontWeight: 'bold', fontSize: 17, marginBottom: 8, color: '#E8820C' },});
توقّع وتحقّق
ما الذي يجعل المكوّن قابلًا لإعادة الاستخدام ببياناتٍ مختلفة؟
قيمة افتراضية لـ prop تُكتب:
ما بين وسمَي المكوّن يصل عبر:
لتمرير رقمٍ كـ prop:
الخلاصة
propsتمرّر بياناتٍ للمكوّن فيصبح قالبًا قابلًا لإعادة الاستخدام.- يمكن إعطاء
propsقيَمًا افتراضية وتمرير منطقٍ شرطيّ. childrenهو المحتوى بين وسمَي المكوّن.
تحدٍّ برمجي: مكوّن تقييم بالنجوم
متوسطاصنع مكوّنًا يستقبل عدد النجوم ويعرضها.
- عرّف مكوّن
Starsيستقبل prop اسمهcount. - يعرض
<Text testID="stars">فيه «★» مكرّرة count مرّة ('★'.repeat(count)). - استخدمه في App بـ
count={4}.
👀 اعرض الناتج المطلوب (وجرّبه)
- الكود يعمل بلا أخطاء في Console
- أربع نجوم
- المكوّن يستقبل count
- استُخدم repeat
💡 تلميح 1
'★'.repeat(count) يكرّر النجمة.💡 تلميح 2
<Stars count={4} />.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
import { View, Text, StyleSheet } from 'react-native'; function Stars({ count }) { return <Text testID="stars" style={styles.s}>{'★'.repeat(count)}</Text>;} export default function App() { return ( <View style={{ padding: 20 }}> <Stars count={4} /> </View> );} const styles = StyleSheet.create({ s: { fontSize: 28, color: '#E8820C' },});