طبقات السحب المخصصة والسحب والإفلات متعدد الحاويات
اعرض معاينات سحب مخصصة باستخدام DragOverlay، ونفّذ التفاعلات على نمط كانبان للسحب بين الحاويات
طبقات السحب المخصصة والسحب والإفلات متعدد الحاويات درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
DragOverlay بوصفه بوابة
يعرض DragOverlay محتواه بوصفه بوابة React، ويلحقه مباشرةً بـ document.body بدلًا من وضعه داخل شجرة DOM الخاصة بـ DndContext. وهذا يعني أن حاويات overflow:hidden أو overflow:scroll لا تقصّه مطلقًا، وأنه يظهر دائمًا فوق جميع العناصر الأخرى من دون الحاجة إلى إدارة z-index يدويًا.
الاستقلال المرئي للمعاينة
بما أن DragOverlay منفصل عن العنصر الأصلي، يمكن أن تكون له أنماط مرئية قد تؤدي إلى اختلال التخطيط إذا طُبّقت على العنصر الأصلي. يمكنك إضافة ظل إسقاط أو تحويل تحجيم، لجعله أكبر قليلًا من العنصر الأصلي، أو تأثير تدوير. وتنقل هذه المؤشرات المرئية للمستخدم أن العنصر «مرفوع» ويتحرك.
تتبّع activeDragId
يحتاج DragOverlay إلى معرفة المحتوى الذي سيعرضه. تتبّع معرّف السحب النشط في الحالة: عيّنه في onDragStart باستخدام event.active.id، وامسحه في onDragEnd باستخدام null. داخل DragOverlay، استخدم ذلك المعرّف للعثور على بيانات العنصر المطابق وعرض مكوّن المعاينة الصحيح.
عنصر نائب في الموضع الأصلي
عند استخدام DragOverlay، ينبغي أن يتحول العنصر الأصلي القابل للسحب إلى عنصر نائب مرئي أثناء السحب. عند استخدام useSortable، طبّق opacity: 0 أو حدًا متقطعًا عندما تكون isDragging مساوية لـ true. ويُظهر ذلك «الموضع» الذي سيعود إليه العنصر إذا أُلغي السحب، كما يوضح الفجوة التي يتركها عند نقله إلى موضع جديد.
إعداد السحب والإفلات بين حاويات متعددة
يعني السحب والإفلات بين حاويات متعددة إمكانية سحب العناصر بين قائمتين منفصلتين أو أكثر. ويتطلب الإعداد DndContext واحدًا يغلّف جميع الحاويات، مع امتلاك كل حاوية SortableContext خاصًا بها. ويجب أن تكون جميع معرّفات العناصر عبر جميع الحاويات فريدة على مستوى التطبيق لتجنب التصادمات.
استخدام onDragOver للنقل بين الحاويات
للحصول على حركة سلسة بين الحاويات، حدّث الحالة في onDragOver بدلًا من الانتظار حتى onDragEnd. عندما يعبر العنصر المسحوب إلى حاوية جديدة، انقله فورًا من الحاوية المصدر إلى الحاوية الهدف. ويمنح ذلك ملاحظات مرئية آنية توضّح للمستخدم المكان الذي سيستقر فيه العنصر.
معرّفات فريدة عبر جميع الحاويات
عند السحب عبر مثيلات SortableContext متعددة، يجب أن تكون جميع معرّفات العناصر فريدة ضمن DndContext بأكمله، لا ضمن كل قائمة فقط. فإذا اشتركت حاويتان في المعرّف نفسه، فلن يتمكن dnd-kit من تحديد العنصر النشط. استخدم UUIDs أو أضف اسم الحاوية إلى بداية المعرّفات لضمان تفردها عالميًا.
active.data.current للبيانات الوصفية المخصصة
يقبل useDraggable وuseSortable خيار data: useSortable({ id, data: { containerId, type } }). وتتوافر هذه البيانات في ردود نداء أحداث السحب بصيغة event.active.data.current. وفي سيناريوهات الحاويات المتعددة، يمكنك تخزين معرّف الحاوية المصدر في data واستخدامه في onDragOver لمعرفة مصدر العنصر.
تحديث حالة الحاويات أثناء السحب
تستخدم الحالة بين الحاويات المتعددة عادةً كائنًا مفهرسًا بمعرّف الحاوية، ويحتوي كل عنصر فيه على مصفوفة من العناصر. في onDragOver، عندما يكون العنصر النشط في حاوية مختلفة عن الحاوية الهدف، أزل العنصر من مصفوفة الحاوية المصدر وأدرجه في مصفوفة الحاوية الهدف في الموضع الصحيح.
التنقل المتاح بين الحاويات المتعددة
يعمل KeyboardSensor مع السحب والإفلات بين الحاويات المتعددة. يضغط المستخدمون مفاتيح الأسهم للتنقل بين العناصر داخل الحاوية، وعند الوصول إلى حافتها يمكنهم متابعة التنقل إلى الحاويات المجاورة. وتحدد خوارزمية collisionDetection في SortableContext أقرب هدف إفلات صالح استنادًا إلى الموضع.
خوارزميات اكتشاف التصادم
يقبل DndContext خاصية collisionDetection التي تحدد كيفية حسابه للعنصر القابل للإفلات الذي يوجد العنصر المسحوب فوقه. وتعمل closestCenter الافتراضية جيدًا مع معظم القوائم. وتناسب closestCorners الشبكات أكثر. أما pointerWithin فلا تنشّط العنصر القابل للإفلات إلا عندما يكون المؤشر داخل حدوده فعليًا.
سلوك بوابة DragOverlay
أين يعرض DragOverlay محتواه في DOM؟
مراجعة الدرس: المعاينات والحاويات المتعددة
يعرض DragOverlay محتواه بوصفه بوابة إلى document.body، مما يوفر استقلالًا مرئيًا عن قيود التخطيط. تتبّع activeDragId في onDragStart وonDragEnd لعرض محتوى المعاينة الصحيح. ويستخدم السحب والإفلات بين حاويات متعددة مثيلات SortableContext متعددة داخل DndContext واحد، مع معرّفات فريدة عالميًا. حدّث الحالة في onDragOver للحصول على حركات سلسة بين الحاويات، باستخدام event.active.data.current لبيانات الحاوية المصدر.
تعلم React مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 88
- الدروس
- 324
الأسئلة الشائعة
هل درس «طبقات السحب المخصصة والسحب والإفلات متعدد الحاويات» مجاني؟
نعم — نص درس «طبقات السحب المخصصة والسحب والإفلات متعدد الحاويات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «طبقات السحب المخصصة والسحب والإفلات متعدد الحاويات»؟
اعرض معاينات سحب مخصصة باستخدام DragOverlay، ونفّذ التفاعلات على نمط كانبان للسحب بين الحاويات تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «طبقات السحب المخصصة والسحب والإفلات متعدد الحاويات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بنية dnd-kit والتصميم الذي يقدّم إتاحة الوصول أولًا
- DndContext وuseDraggable وuseDroppable
- SortableContext للقوائم القابلة لإعادة الترتيب
- طبقات السحب المخصصة والسحب والإفلات متعدد الحاويات