VariableSizeList: ارتفاعات الصفوف الديناميكية
تعاملوا مع العناصر ذات الارتفاعات المختلفة باستخدام VariableSizeList ونمط callback الخاص بـ itemSize.
VariableSizeList: ارتفاعات الصفوف الديناميكية درس مجاني في React Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
عندما تكون للعناصر ارتفاعات مختلفة
لا تكون الصفوف موحّدة أحيانًا: فقد تضم قائمة محادثة رسائل قصيرة وطويلة، أو تحتوي خلاصة على بطاقات ذات محتوى متفاوت. لا تستطيع FixedSizeList التعامل مع ذلك لأنها تفترض وجود itemSize ثابت واحد.
في هذه الحالات، توفر react-window نوعًا من القوائم يتيح لكل عنصر تحديد حجمه الخاص.
VariableSizeList تحل محل FixedSizeList
تعمل VariableSizeList مثل FixedSizeList، لكنها تقبل حجمًا خاصًا بكل عنصر. تستوردونها بدلًا منها وتقدمون دالة تعيد حجم أي index محدد.
يبقى كل شيء آخر، بما في ذلك دالة تصيير children والخاصية style المحورية، كما هو، لذا تكون عملية الانتقال بسيطة.
itemSize كدالة
مع VariableSizeList، تكون itemSize دالة تتلقى index وتعيد ارتفاع ذلك الصف بالبكسل. تستدعيها react-window لحساب الإزاحات وتحديد النافذة المرئية.
يتيح لكم هذا ترميز الارتفاعات المعروفة، مثل تحديد صفوف أطول للعناصر التي تحتوي على صور وصفوف أقصر للنصوص العادية.
الحساب المسبق مقابل القياس
إذا كنتم تعرفون ارتفاع كل صف مسبقًا، فيمكنكم إعادته مباشرةً من دالة itemSize. أما إذا كان الارتفاع يعتمد على المحتوى المصيّر، فيجب قياس الصفوف بعد رسمها.
تُعد الارتفاعات المحسوبة مسبقًا أبسط وأسرع، بينما تكون الارتفاعات المقاسة أكثر مرونة لكنها تتطلب جهدًا إضافيًا لإعادة تمرير الأحجام إلى القائمة.
resetAfterIndex بعد القياس
تخزّن VariableSizeList إزاحات العناصر مؤقتًا لتحسين الأداء. وعندما يتغيّر ارتفاع مقاس، يجب استدعاء طريقة resetAfterIndex في القائمة عبر ref الخاص بها، كي تعيد حساب المواضع بدءًا من ذلك index فصاعدًا.
يؤدي نسيان ذلك إلى إبقاء الإزاحات قديمة والصفوف غير محاذاة، لذلك تُعد resetAfterIndex المفتاح لإنجاح القياس الديناميكي.
مفارقة معرفة الارتفاع
توجد هنا مشكلة الدجاجة والبيضة: تحتاجون إلى ارتفاع لتصيير الصف، لكنكم لا تعرفون الارتفاع الحقيقي إلا بعد تصييره. ويجب على القائمة وضع الصف قبل أن تتمكن من قياسه.
يتطلب حل ذلك التصيير باستخدام تقدير أولًا، ثم تصحيح الموضع بعد معرفة الارتفاع الحقيقي.
التقدير والتصيير والقياس والتحديث
يتمثل النمط المعتاد في تصيير الصفوف بارتفاع تقديري، وقياس ارتفاعها الفعلي بعد الرسم باستخدام ref أو ResizeObserver، وتخزين القيمة المقاسة، ثم استدعاء resetAfterIndex لتحديث المواضع.
تتقارب هذه الحلقة بسرعة، فتستقر القائمة على إزاحات صحيحة بعد أول جولة قياس.
يجب أن تكون getItemSize مستقرة
ينبغي أن تظل دالة itemSize مستقرة عبر عمليات إعادة التصيير، وعادةً ما تُغلّف باستخدام useCallback، حتى لا تبطل القائمة صلاحية الإزاحات المخزنة مؤقتًا باستمرار.
قد تؤدي دالة غير مستقرة معرّفة داخل السطر إلى إعادة حساب غير ضرورية، مما يضر بالأداء الذي تهدف المحاكاة الافتراضية إلى توفيره.
المفاضلة المتعلقة بالأداء
تنفّذ VariableSizeList عملاً أكثر من FixedSizeList لأنها لا تستطيع افتراض إزاحة ثابتة، وعليها تتبّع حجم كل عنصر على حدة. وعند قياس الارتفاعات، يضيف القياس الإضافي تكلفةً أيضاً.
في القوائم التي تختلف فيها ارتفاعات الصفوف فعلاً، تستحق هذه التكلفة العناء؛ أما في الصفوف متساوية الارتفاع، فتظل FixedSizeList الخيار الأسرع والأبسط.
العودة إلى Fixed باستخدام التقريب
إذا كان القياس الديناميكي الدقيق مكلفاً جداً، فيمكنك أحياناً استخدام التقريب. إذ يتيح لك تجميع الصفوف في بضع فئات ذات ارتفاعات ثابتة، أو استخدام متوسط معقول، الاستمرار في استخدام FixedSizeList.
يستبدل ذلك التخطيط المطابق لكل بكسل بالبساطة والسرعة، وهو حل وسط مقبول عندما يمكن تحمّل بعض العيوب الطفيفة في الإزاحات.
اختبار سريع: itemSize في VariableSizeList
تذكّر كيف يتعرّف VariableSizeList على ارتفاع كل صف.
مراجعة: VariableSizeList
تتعامل VariableSizeList مع الصفوف ذات الارتفاعات المختلفة من خلال أخذ itemSize كدالة تعتمد على الفهرس. يمكن حساب الارتفاعات مسبقاً أو قياسها؛ أما الارتفاعات المقيسة فتحتاج إلى حلقة التقدير ثم العرض ثم القياس ثم التحديث، مع استخدام resetAfterIndex.
احرص على ثبات دالة itemSize باستخدام useCallback. فهي تكلّف أكثر من FixedSizeList، لذلك يُفضّل استخدام البديل الثابت مع الصفوف متساوية الارتفاع أو عندما يكون التقريب كافياً.
الأسئلة الشائعة
هل درس «VariableSizeList: ارتفاعات الصفوف الديناميكية» مجاني؟
نعم — نص درس «VariableSizeList: ارتفاعات الصفوف الديناميكية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «VariableSizeList: ارتفاعات الصفوف الديناميكية»؟
تعاملوا مع العناصر ذات الارتفاعات المختلفة باستخدام VariableSizeList ونمط callback الخاص بـ itemSize. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «VariableSizeList: ارتفاعات الصفوف الديناميكية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مشكلة عرض القوائم الكبيرة
- FixedSizeList: عرض آلاف العناصر
- VariableSizeList: ارتفاعات الصفوف الديناميكية
- دمج Virtualization مع جلب البيانات