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

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

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 تبسيط واجهة المكون. يتم تحقيق ذلك من خلال توفير وظائف تسمح بتخصيص دقيق دون الحاجة إلى إضافة العديد من الخصائص.

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

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

اشترك الآن 🚀

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

في هذا المقال
اشترك الآن واكمل قراءة المقال
قناة اقرأ-تِك على التليجرام قناة اقرأ-تِك على التليجرام

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

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

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

  • 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
  • NextJS Caching Mechanisms 1 min read

    NextJS Caching Mechanisms

    Ali Alaa El-Din Ali Alaa El-Din • 11 Feb, 2025
    Ali Alaa El-Din Ali Alaa El-Din
    Front End Developer
    • Website
  • HTTP Caching 2 min read

    HTTP Caching

    Saeed Khaled Saeed Khaled • 29 Jan, 2025
    Saeed Khaled Saeed Khaled
    Frontend Developer
    • Website
اقرأ-تك اقرأ-تك
  • الرئيسية
  • المقالات
  • خطط الاشتراك
  • - اصدارتنا
  • ورقة وقلم
  • مدونات فطين
  • شنطة مبرمج
  • النشرة الأسبوعية
  • كنوز
  • - تعرف علينا
  • من نحن
  • الشراكات
  • كتاب المحتوى
  • اكتب معنا
  • تواصل معنا
  • - بنود الخدمة
  • سياسة الخصوصية
  • الشروط والأحكام
الوسوم
  • Backend
  • Distributed Systems
  • System Design
  • Databases
  • LinkedIn
  • X
  • Facebook
  • Telegram
  • GitHub
جميع الحقوق محفوظة لمنصة اقرأ-تِك 2024©