نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
REA

منهج React Js

دليل مرجعي شامل

كل اللغات
مدرسة البرمجة/منهج React Js/Sorting, Filtering, Pagination

Sorting, Filtering, Pagination

الفلترة والترتيب في ريأكتSorting andReact Pagination، Sorting and Filtering Listsتقطيع القوائم في ريأكتuseMemo مع Listsكورس React كامل

جدول مرجعي سريع

1

معالجة البيانات والقوائم المركبة (Sorting, Filtering, Pagination)

العملية الهندسيةالآلية البرمجية في Reactالأثر على الأداء وتجربة المستخدم (UX)
الفلترة الحية Filteringاستخدام دالة filter مع ربط القيمة بحالة البحث (Search State)تصفية القائمة لحظياً وعرض النتائج المطابقة فقط دون الاتصال بالسيرفر في كل حرف
الترتيب الديناميكي Sortingاستخدام دالة sort مع نسخ المصفوفة لمنع تعديل الأصل (Immutability)ترتيب العناصر أبجدياً أو حسب السعر/التاريخ دون إعطاب مراجع الذاكرة
التقسيم إلى صفحات Paginationاستقطاع جزء محدد من البيانات باستخدام slice بناءً على رقم الصفحةتخفيف العبء عن شجرة الـ DOM وتوفير واجهة مريحة ومنظمة
الحسابات المحسّنة Memoized Calculationsتغليف عمليات المعالجة المركبة بـ useMemoمنع إعادة تنفيذ الترتيب والفلترة المجهدة عند رندرة المكون لأسباب غير متعلقة بالبيانات

الشرح

عند بناء لوحات التحكم أو القوائم التفاعلية، لا يُكتفى بعرض البيانات كما وردت من السيرفر. يرغب المستخدم دائماً في تقليص البيانات وتخصيص طريقة عرضها.

الهدف الهندسي هنا هو إجراء الجمع بين الفلترة، الترتيب، والتقسيم بأسلوب سلس يضمن أقصى أداء ممكن دون التأثير على ذاكرة التطبيق.

1. الفلترة الحية (Filtering)

ℹ️ معلومة

الفلترة هي استبعاد العناصر التي لا تطابق كلمة البحث التي يدخلها المستخدم.

يتم التحقق من النصوص بدون الحساسية لحالة الأحرف (Case-Insensitive) عبر تحويل الطرفين إلى toLowerCase().

javascript
1// فلترة العناصر التي تحتوي على كلمة البحث داخل عنوان الكورس
2const filteredCourses = courses.filter((course) =>
3 course.title.toLowerCase().includes(searchQuery.toLowerCase())
4);

2. الترتيب الديناميكي (Sorting)

بعد الفلترة، تأتي مرحلة الترتيب بناءً على معيار معين (السعر، الأبجدية، التاريخ).

ℹ️ معلومة

دالة .sort() التابعة لجافا سكريبت تعدل المصفوفة الأصلية مباشرة (Mutation). هذا يكسر مبدأ الـ Immutability في React ويميل إلى منع إعادة الرندرة بالشكل الصحيح!

إنشاء نسخة

إنشاء نسخة
1// خطأ: تعديل الأصل يفسد الـ State
2// courses.sort(...);
3
4// صح: استخدام Spread Operator لإنشاء مصفوفة جديدة قبل الترتيب
5const sortedCourses = [...filteredCourses].sort((a, b) => {
6 if (sortBy === 'price') return a.price - b.price; // ترتيب تصاعدي حسب السعر
7 return a.title.localeCompare(b.title); // ترتيب أبجدي صحيح للكلمات
8});

3. التقسيم إلى صفحات (Pagination)

بدلاً من عرض 100 عنصر في الشاشة وإغراق الـ DOM، نحدد عدداً ثابتاً من العناصر لكل صفحة ونستقطع الجزء المطلوب فقط بفضل .slice().

المعالجة الرياضية للتقسيم:

javascript
1startIndex = (currentPage - 1) * itemsPerPage
2
javascript
1endIndex = startIndex + itemsPerPage
2
javascript
1const itemsPerPage = 5;
2const startIndex = (currentPage - 1) * itemsPerPage;
3
4// استقطاع أجزاء الصفحة الحالية فقط
5const paginatedCourses = sortedCourses.slice(startIndex, startIndex + itemsPerPage);
6
7// حساب إجمالي عدد الصفحات
8const totalPages = Math.ceil(sortedCourses.length / itemsPerPage);

4. الربط المكتمل وتحسين الأداء بـ useMemo

إذا أعيد رسم المكون لأي سبب (مثل فتح القائمة الجانبية أو ضغط زر غير متعلق بالبيانات)، ستُعاد الفلترة والترتيب والتقسيم من جديد بلا أي فائدة! الحل هو تغليف تسلسل العمليات بـ useMemo، لضمان عدم إعادة المعالجة الحسابية إلا إذا تغيرت البيانات الأصلية أو خيارات الفلترة/الترتيب:

javascript
1const processedData = useMemo(() => {
2 // 1. الفلترة
3 let result = courses.filter((c) =>
4 c.title.toLowerCase().includes(search.toLowerCase())
5 );
6
7 // 2. الترتيب
8 result = [...result].sort((a, b) => a.price - b.price);
9
10 // 3. الإرجاع النهائي
11 return result;
12}, [courses, search]); // التحديث يحدث فقط عند تغيير هذه المتغيرات

فخ الصفحة الفارغة (Empty Page Bug)!

⚠️ تحذير

إذا كان المستخدم يصفح في الصفحة رقم 5، ثم قام فجأة بكتابة كلمة بحث أرجعت نتيجتين فقط (أي صفحة واحدة)، فإن معادلة .slice() ستفشل في العثور على أي عناصر في الصفحة رقم 5، وتظهر الواجهة كأنها فارغة تماماً!

الحل البرمجي الصارم:

مع كل تغيير يطرأ على كائن البحث أو الفلتر، يجب تصفير رقم الصفحة وإرجاع المستخدم فوراً للصفحة رقم 1:

javascript
1const handleSearchChange = (e) => {
2 setSearchQuery(e.target.value);
3 setCurrentPage(1); // إعادة تصفير رقم الصفحة فوراً لمنع الواجهات الفارغة
4};

الدرس السابق

عرض القوائم الضخمة Virtualization

الدرس التالي

Multi-Select & Bulk Actions

نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر