طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 251 · برمجة الأجهزة الذكية
الدرس 9 · الوحدة 5: تطوير تطبيقات باستخدام React Native

مكوّنات قابلة لإعادة الاستخدام: 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:

الخلاصة

تحدٍّ برمجي: مكوّن تقييم بالنجوم

متوسط

اصنع مكوّنًا يستقبل عدد النجوم ويعرضها.

المطلوب:
  • عرّف مكوّن 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' },});
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس