تحديد الصفوف والجداول الافتراضية
أضف تحديد الصفوف عبر مربعات الاختيار، وادمج TanStack Table مع TanStack Virtual لعرض مجموعات البيانات الكبيرة
تحديد الصفوف والجداول الافتراضية درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
تفعيل تحديد الصفوف
أضِف عمود تحديد إلى مصفوفة ColumnDef باستخدام المعرّف 'select'. وتعرض الخلية خانة اختيار موصولة بـ row.getToggleSelectedHandler(). أما الرأس فيعرض خانة اختيار لتحديد الكل باستخدام table.getToggleAllRowsSelectedHandler().
مرّر أيضًا حالتي rowSelection و onRowSelectionChange إلى useReactTable.
التحقق من حالة التحديد
تعيد row.getIsSelected() القيمة true عندما يكون الصف محددًا حاليًا، مما يجعلها مناسبة لتطبيق نمط خلفية مميز على الصفوف المحددة.
تتعامل row.getIsSomeSelected() مع حالة خانة الاختيار غير المحسومة عندما تكون بعض الصفوف فقط في مجموعة محددة، وهو أمر مفيد في الجداول المجمعة.
الحصول على الصفوف المحددة
تعيد table.getSelectedRowModel().rows مصفوفة من جميع كائنات الصفوف المحددة حاليًا. ويحتوي كل صف على الخاصية row.original التي تتضمن كائن البيانات الأصلي.
بهذه الطريقة تنشئ أزرار الإجراءات الجماعية التي تعمل على المجموعة المحددة، مثل "حذف المحدد" أو "تصدير المحدد".
نمط واجهة الإجراءات الجماعية
اعرض أزرار الإجراءات بشكل مشروط استنادًا إلى table.getSelectedRowModel().rows.length > 0. وعند عدم تحديد أي صفوف، أخفِ شريط أدوات الإجراءات الجماعية أو عطّله لتجنب التفاعلات المربكة مع حالة فارغة.
اعرض عدد العناصر المحددة في الواجهة: "{count} صفوف محددة" لإبقاء المستخدمين على اطلاع بتحديدهم.
لماذا نستخدم العرض الافتراضي للجداول؟
يؤدي عرض 10,000 صف كعُقد DOM إلى بطء شديد. إذ يجب على المتصفح تخطيط آلاف العناصر ورسمها وإدارتها. ويختبر المستخدمون تمريرًا متقطعًا وعرضًا أوليًا بطيئًا.
يعرض العرض الافتراضي الصفوف الظاهرة حاليًا في إطار العرض فقط، مما يقلل حجم DOM بدرجة كبيرة ويحسّن الأداء.
تثبيت TanStack Virtual
ثبّت @tanstack/react-virtual إلى جانب @tanstack/react-table. فالمكتبتان منفصلتان، لكنهما مصممتان للتكامل. يدير TanStack Table منطق البيانات، بينما يدير TanStack Virtual العناصر التي تُعرض في DOM.
نقطة التكامل هي مصفوفة الصفوف الناتجة عن table.getRowModel().rows.
إعداد useVirtualizer
استدعِ useVirtualizer({ count: table.getRowModel().rows.length, getScrollElement: () => tableContainerRef.current, estimateSize: () => 35 }). يحدد count عدد العناصر الافتراضية الموجودة، بما يطابق عدد الصفوف الحالي في الجدول بعد تطبيق جميع عوامل التصفية.
يوفّر estimateSize تقديرًا أوليًا لارتفاع الصف؛ وتُقاس الارتفاعات الفعلية أثناء عرض الصفوف.
عرض العناصر الافتراضية
استدعِ virtualizer.getVirtualItems() للحصول على الصفوف التي ينبغي أن تكون موجودة حاليًا في DOM فقط. كرّر على هذه المصفوفة، واصل إلى الصف الحقيقي من خلال table.getRowModel().rows[virtualRow.index]، ثم اعرض عناصر tr تلك فقط.
يحتوي كل عنصر افتراضي على الخاصية start لتحديد موضعه المطلق داخل حاوية التمرير.
إضافة عناصر div فاصلة للحشو
للحفاظ على موضع التمرير الصحيح، أضِف عنصر div فاصلًا علويًا بارتفاع يساوي قيمة start لأول عنصر افتراضي، وعنصر div فاصلًا سفليًا بارتفاع يساوي الحجم الإجمالي مطروحًا منه نهاية العنصر الأخير.
تملأ عناصر div غير المرئية هذه المساحة التي كانت ستشغلها الصفوف غير المعروضة، وتحافظ على تناسب شريط التمرير بشكل صحيح.
الارتفاع الديناميكي للصفوف باستخدام measureElement
مرّر measureElement: el => el.getBoundingClientRect().height إلى useVirtualizer للحصول على ارتفاعات ديناميكية دقيقة للصفوف. ويُربط مرجع كل صف بعنصر tr حتى يقيس virtualizer ارتفاعه الفعلي بعد العرض.
يتعامل هذا الأسلوب مع الصفوف ذات المحتوى المتفاوت (النص متعدد الأسطر والصفوف الموسعة) من دون حدوث تحولات في التخطيط.
دمج جميع الميزات
يمكن دمج TanStack Table مع الفرز والتصفية والتقسيم إلى صفحات وتحديد الصفوف وTanStack Virtual معًا. وينبغي أن يأتي عدد الصفوف المُمرر إلى useVirtualizer من table.getRowModel().rows بعد أن تعالج جميع نماذج الصفوف النشطة البيانات.
عند تفعيل التقسيم إلى صفحات، قسّم الصفوف إلى صفحات أولًا، ثم استخدم العرض الافتراضي لصفوف الصفحة الحالية لتوفير تمرير سلس داخل صفحة كبيرة.
تحديد الصفوف في TanStack Table
ما الدالة التي تعيد كائنات البيانات الأصلية لجميع الصفوف المحددة حاليًا؟
مراجعة الدرس
يستخدم تحديد الصفوف عمودًا لخانات الاختيار مع getToggleSelectedHandler وحالة rowSelection، كما يستخدم table.getSelectedRowModel().rows للوصول إلى البيانات المحددة. ويعرض useVirtualizer الصفوف الظاهرة فقط من خلال getVirtualItems وعناصر div الفاصلة، مع إمكانية استخدام measureElement للارتفاعات الديناميكية.
تتآلف جميع ميزات TanStack Table (الفرز والتصفية والتقسيم إلى صفحات والتحديد) بسلاسة مع العرض الافتراضي.
الأسئلة الشائعة
هل درس «تحديد الصفوف والجداول الافتراضية» مجاني؟
نعم — نص درس «تحديد الصفوف والجداول الافتراضية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «تحديد الصفوف والجداول الافتراضية»؟
أضف تحديد الصفوف عبر مربعات الاختيار، وادمج TanStack Table مع TanStack Virtual لعرض مجموعات البيانات الكبيرة تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تحديد الصفوف والجداول الافتراضية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فلسفة TanStack Table والتصميم بلا واجهة
- تعريف الأعمدة وعرض الصفوف
- الفرز والتصفية والترقيم
- تحديد الصفوف والجداول الافتراضية