Skip to Sidebar Skip to Content
اقرأ-تك اقرأ-تك
ضيفنا الكريم

  • قائمة القراءة
  • تسجيل الدخول
  • الرئيسية
  • المقالات
  • خطط الاشتراك
  • - اصدارتنا
  • ورقة وقلم
  • مدونات فطين
  • النشرة الأسبوعية
  • كتبنا وإصداراتنا
  • - تعرف علينا
  • من نحن
  • الشراكات
  • كتاب المحتوى
  • اكتب معنا
  • تواصل معنا
  • - بنود الخدمة
  • سياسة الخصوصية
  • الشروط والأحكام
الوسوم
  • Backend
  • Distributed Systems
  • System Design
  • Databases
  • LinkedIn
  • X
  • Facebook
  • Telegram
  • GitHub
جميع الحقوق محفوظة لمنصة اقرأ-تِك ©2026

Prop Getters Pattern In React

  • Oussama Djaidri by Oussama Djaidri
    Oussama Djaidri Oussama Djaidri
    Front-End Engineer
    • Website
  • •
  • 12 Jan, 2024
  • •
  • 6 min read
  • Share on X
  • Share on Facebook
  • Share on LinkedIn
  • Share on Pinterest
  • Email
Prop Getters Pattern In React
Prop Getters Pattern In React
  • Frontend
  • React
  • Technologies & Frameworks

في عالم برمجة واجهات المستخدم الحديثة، يُعد تحقيق التوازن بين المرونة وسهولة الاستخدام من الأهداف المهمة للمطورين. يُمثل نمط Prop Getters في React إحدى الطرق الفعّالة لتحقيق هذه الأهداف، مما يُتيح بناء مكونات ديناميكية تتميز بالمرونة وقابلية التخصيص. في هذا المقال سنستكشف كيف يُمكن لنمط Prop Getters أن يُحدث فرقًا كبيرًا في تطوير مكونات React.

كمثال عملي، سنستخدم نفس المُكون Progress Bar الذي صممناه في مقال سابق، مع العلم أنه يُمكن الرجوع إلى المقال من هنا لمن يرغب في الإطلاع على الشرح التفصيلي لأجزاء المُكون، حيث سنركز فقط في هذا المقال على الجزء الذي يستخدم نمط Prop Getters.

تعريف نمط التصميم Prop Getters

في عالم ألعاب الفيديو، تُوفر وحدات التحكم (controllers) ميزة تعديل وظائف الأزرار وإعادة تخصيصها لتُناسب تفضيلات اللاعب. يمكنك مثلاً في لعبة FIFA تغيير زر التسديد أو التمرير إلى زر آخر. هذه القدرة على إعادة تخصيص وحدة التحكم تشبه كثيرا ما يفعله نمط Prop Getters. يُتيح لك هذا النمط إعادة تعيين وتغيير "خصائص" المكونات في تطبيقك، مما يمنحك القدرة على تكييف وظائفها ومظهرها بما يتوافق مع متطلباتك الخاصة.

بناءا على هذا المثال يُمكننا تعريف نمط الـ Prop Getters على أنه طريقة لإعطاء المزيد من القدرة على التحكم للمستخدمين في كيفية تخصيص المكونات. يتم ذلك من خلال توفير دوال (functions) تُعيد مجموعة من الخصائص (props)، والتي يُمكن للمستخدمين بعد ذلك استخدامها لتعديل وتخصيص المكونات. هذا يُشبه إلى حدٍ ما إعطاء الأشخاص عدة أدوات لتخصيص منتج ما حسب رغبتهم، بدلاً من تقديم المنتج بصورة نهائية لا يُمكن تعديلها.


مزايا نمط التصميم Prop Getters

  • توفير خيارات تخصيص مرنة: يسمح نمط Prop Getters لمستخدمي المكون بتخصيص السلوك والمظهر بشكل أكثر دقة ومرونة. يمكن للمطورين تجاوز السلوك الافتراضي أو توسيعه بسهولة، مما يجعل المكونات أكثر قابلية للتكيف مع المتطلبات المُتغيرة.
// ❌ Without Prop Getters Pattern

<DropdownMenu
  className={`dropdown-menu ${true ? 'dropdown-menu-bordered' : ''} dropdown-menu-primary dropdown-menu-blue`}
  style={{
    overflow: "auto",
    border: true ? '1px solid blue' : 'none',
    padding: '10px',
    boxShadow: '0px 2px 5px rgba(0, 0, 0, 0.2)',
    // ... المزيد من التنسيقات الخاصة بالقائمة الرئيسية
  }}
  // ... أي خصائص أخرى محددة للقائمة الرئيسية
>
  <DropdownMenuItem
    className="dropdown-item dropdown-item-small"
    style={{
      color: 'blue',
      backgroundColor: 'white',
      padding: '5px',
      margin: '5px',
      border: '1px solid lightgray',
      // ... المزيد من التنسيقات الخاصة بعنصر القائمة
    }}
    // ... أي خصائص أخرى محددة لعنصر القائمة
  >
    Item 1
  </DropdownMenuItem>
  <DropdownMenuItem
    className="dropdown-item dropdown-item-small"
    style={{
      color: 'blue',
      backgroundColor: 'white',
      padding: '5px',
      margin: '5px',
      border: '1px solid lightgray',
      // ... المزيد من التنسيقات الخاصة بعنصر القائمة
    }}
    // ... أي خصائص أخرى محددة لعنصر القائمة
  >
    Item 2
  </DropdownMenuItem>
  {/* المزيد من عناصر القائمة */}
</DropdownMenu>
// ✅ With Prop Getters Pattern

// 👉 use-dropdown-menu.ts
function getDropdownMenuProps({ colorScheme, accentColor, hasBorder, customProps }) {
  return {
    className: `dropdown-menu dropdown-menu-${colorScheme} dropdown-menu-${accentColor} ${hasBorder ? 'dropdown-menu-bordered' : ''}`,
    style: {
      overflow: customProps.scrollBehavior,
      border: hasBorder ? '1px solid blue' : 'none',
      padding: '10px',
      boxShadow: '0px 2px 5px rgba(0, 0, 0, 0.2)',
      // ... أي تنسيقات أخرى
    },
    // ... أي خصائص أخرى
  };
}

function getDropdownMenuItemProps({ size }) {
  return {
    className: `dropdown-item dropdown-item-${size}`,
    style: {
      color: 'blue',
      backgroundColor: 'white',
      padding: '5px',
      margin: '5px',
      border: '1px solid lightgray',
      // ... أي تنسيقات أخرى
    },
    // ... أي خصائص أخرى
  };
}

// 👉 dropdown-menu.tsx
// أنظر كيف يبدو المُكون الآن أقل تعقيدا و واجهته أنظف مع سهولة التخصيص
<DropdownMenu {...getDropdownMenuProps({
  colorScheme: "primary",
  accentColor: "blue",
  hasBorder: true,
  customProps: {
    scrollBehavior: "auto",
  },
})}>
  <DropdownMenuItem {...getDropdownMenuItemProps({ size: "small" })}>
    Item 1
  </DropdownMenuItem>
  <DropdownMenuItem {...getDropdownMenuItemProps({ size: "small" })}>
    Item 2
  </DropdownMenuItem>
  {/* المزيد من عناصر القائمة */}
</DropdownMenu>
  • تقليل تضخم الخصائص وتعقيدها: بدلاً من إضافة العديد من الخصائص لتغطية كل سيناريو ممكن، يمكن لـ Prop Getters تبسيط واجهة المكون. يتم تحقيق ذلك من خلال توفير وظائف تسمح بتخصيص دقيق دون الحاجة إلى إضافة العديد من الخصائص.

هذا المقال مخصص للأعضاء المنتسبين لخطط الاشتراك المدفوعة فقط

اشترك الآن وتصفح كافة المقالات المميزة واستمتع بمحتوى حصري وابق على اطلاع دائم بالتحديثات المستمرة.

اشترك الآن 🚀

هل لديك حساب؟ تسجيل الدخول

في هذا المقال
اشترك الآن واكمل قراءة المقال
ابدأ رحلتك الآن ابدأ رحلتك الآن
النشرة الأسبوعية

اشترك الآن في نشرة اقرأ‍تِك الأسبوعية

لا تدع أي شيء يفوتك. احصل على أحدث المقالات والشروحات البصرية ومدونات الشركات العالمية مباشرة إلى بريدك الإلكتروني — وبشكل مجاني تمامًا.

  • مقالات تقنية متعمقة في هندسة البرمجيات
  • شروحات بصرية لمفاهيم معقدة بطريقة مبسّطة
  • تجارب عملية من شركات عالمية
انضم لأكثر من 7,000 مشترك
+7,000
قارئ نشط ومشترك
نشرة أسبوعية كل يوم سبت

مقالات ذات صلة

  • How Is Qebla WebApp Actually BackendLess? 1 min read

    How Is Qebla WebApp Actually BackendLess?

    اقرأ-تِك اقرأ-تِك • 27 Aug, 2026
    اقرأ-تِك اقرأ-تِك
    • Beyond Barrel Files 1 min read

      Beyond Barrel Files

      Saeed Khaled Saeed Khaled • 16 Apr, 2026
      Saeed Khaled Saeed Khaled
      Frontend Developer
      • Website
    • Critical Rendering Path 2 min read

      Critical Rendering Path

      Saeed Khaled Saeed Khaled • 19 Aug, 2025
      Saeed Khaled Saeed Khaled
      Frontend Developer
      • Website
    • Thoughts on CORS Policy 3 min read

      Thoughts on CORS Policy

      Mohammed Lashein Mohammed Lashein • 1 Jul, 2025
      Mohammed Lashein Mohammed Lashein
      Full stack developer
      • Website
    • Idempotency in APIs 2 min read

      Idempotency in APIs

      Oussama Djaidri Oussama Djaidri • 16 Jun, 2025
      Oussama Djaidri Oussama Djaidri
      Front-End Engineer
      • Website
    • Browser & Server Negotiation Behind The Scene 2 min read

      Browser & Server Negotiation Behind The Scene

      Saeed Khaled Saeed Khaled • 22 Apr, 2025
      Saeed Khaled Saeed Khaled
      Frontend Developer
      • Website
    • Introduction Into Robots.txt 1 min read

      Introduction Into Robots.txt

      Saeed Khaled Saeed Khaled • 5 Apr, 2025
      Saeed Khaled Saeed Khaled
      Frontend Developer
      • Website
    • Tailwindcss 1 min read

      Tailwindcss

      Alaa Elkzaz Alaa Elkzaz • 31 Mar, 2025
      Alaa Elkzaz Alaa Elkzaz
      Co-Founder & Software Engineer
      • Website
    • Cross-Tab Communication with Broadcast Channel API 1 min read

      Cross-Tab Communication with Broadcast Channel API

      Ahmed Saber Ahmed Saber • 27 Feb, 2025
      Ahmed Saber Ahmed Saber
      Front-End Engineer
      • Facebook
      • Website
    • Introduction Into Cascade in CSS Part 2 2 min read

      Introduction Into Cascade in CSS Part 2

      Ibrahim Harchiche Ibrahim Harchiche • 11 Feb, 2025
      Ibrahim Harchiche Ibrahim Harchiche
      Frontend Developer
      • Website
    اقرأ-تك اقرأ-تك
    • الرئيسية
    • المقالات
    • خطط الاشتراك
    • - اصدارتنا
    • ورقة وقلم
    • مدونات فطين
    • النشرة الأسبوعية
    • كتبنا وإصداراتنا
    • - تعرف علينا
    • من نحن
    • الشراكات
    • كتاب المحتوى
    • اكتب معنا
    • تواصل معنا
    • - بنود الخدمة
    • سياسة الخصوصية
    • الشروط والأحكام
    الوسوم
    • Backend
    • Distributed Systems
    • System Design
    • Databases
    • LinkedIn
    • X
    • Facebook
    • Telegram
    • GitHub
    جميع الحقوق محفوظة لمنصة اقرأ-تِك ©2026

    كل ما يخص هندسة البرمجيات 🚀

    شارك هذا المحتوى الآن وساعدنا في تحقيق رؤيتنا لإثراء المحتوى التقني في العالم العربي!

    أو انقر لنسخ الرابط