DndContext وuseDraggable وuseDroppable
وصّل موفّر DndContext وأنشئ عناصر قابلة للسحب والإفلات باستخدام hooks الخاصة بها
DndContext وuseDraggable وuseDroppable درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
إحاطة ميزتك بـ DndContext
يجب إحاطة كل ميزة للسحب والإفلات في dnd-kit بمكوّن DndContext. يُعدّ DndContext مركز التنسيق؛ فهو يتتبع عمليات السحب النشطة، ويتواصل بين العناصر القابلة للسحب والعناصر القابلة للإفلات، ويستدعي عمليات ردّ الأحداث. عادةً ما تضعه في مستوى المكوّن الذي يدير حالة السحب.
بنية خطاف useDraggable
يجعل الخطاف useDraggable({ id }) أحد المكوّنات قابلًا للسحب. ويعيد أربع قيم أساسية: attributes (سمات ARIA التي تنشرها على العنصر)، وlisteners (معالجات الأحداث لبدء السحب)، وsetNodeRef (يربط مرجع العنصر القابل للسحب)، وtransform (الإزاحة الحالية بالصيغة {x, y, scaleX, scaleY}).
تطبيق useDraggable على عنصر
لتهيئة عنصر قابل للسحب، انشر attributes وlisteners على العنصر، ومرّر setNodeRef باعتباره الخاصية ref. تتضمن السمات role="button" وtabIndex وسمات aria. وتربط المستمعات معالجات أحداث الفأرة ولوحة المفاتيح التي تحتاج إليها dnd-kit لاكتشاف بدء السحب.
تطبيق نمط التحويل
تكون قيمة transform من useDraggable مساويةً لـ null عند عدم السحب، وكائن إحداثيات عند السحب. تحوّلها إلى سلسلة CSS باستخدام CSS.Translate.toString(transform) من الحزمة @dnd-kit/utilities. طبّقها باعتبارها خاصية CSS المسماة transform على العنصر القابل للسحب، لكي يتبع المؤشر بصريًا.
بنية خطاف useDroppable
يحدّد الخطاف useDroppable({ id }) حاويةً بوصفها هدفًا صالحًا للإفلات. ويعيد isOver (قيمة منطقية تكون true أثناء مرور عنصر قابل للسحب فوق هذا الهدف القابل للإفلات) وsetNodeRef لإرفاق المرجع بالعنصر القابل للإفلات. وعلى خلاف useDraggable، لا توجد مستمعات أحداث يجب نشرها.
التغذية الراجعة المرئية باستخدام isOver
تتيح لك قيمة isOver من useDroppable تقديم تغذية راجعة مرئية أثناء السحب. عندما تكون isOver بقيمة true، يمكنك تطبيق لون تمييز أو حد أو تغيير في الخلفية على منطقة الإفلات. ويساعد ذلك المستخدمين على فهم المكان الذي يمكنهم إفلات العنصر فيه، وهو أمر بالغ الأهمية لقابلية الاستخدام وإمكانية الوصول.
onDragEnd: قراءة النتيجة
تتلقى عملية ردّ onDragEnd في DndContext كائن حدث يتضمن خاصيتين مهمتين: يحتوي event.active على العنصر المسحوب، بما في ذلك id الخاص به، ويحتوي event.over على هدف الإفلات، أو تكون قيمته null إذا أُفلت العنصر خارج أي عنصر قابل للإفلات. تستخدم هذه المعرّفات لتحديث حالة تطبيقك.
تحديث الحالة بعد الإفلات
في onDragEnd، بعد التحقق من أن event.over ليس null، تحدّث الحالة لتعكس عملية النقل. على سبيل المثال، إذا كنت تنقل بطاقة بين أعمدة لوحة Kanban، فأزل البطاقة من العمود المصدر وأضفها إلى العمود الهدف الذي يحدده event.over.id.
DragOverlay لمعاينة عائمة
يعرض DragOverlay معاينة عائمة للعنصر المسحوب تتبع المؤشر. ويُعرض بوصفه بوابة (خارج شجرة DOM العادية)، لذلك لا تُقصّه حاويات overflow:hidden مطلقًا. وبخلاف العنصر الأصلي، يمكن أن تتضمن المعاينة ظلال إسقاط وتحويلات تحجيم أو تدويرًا للإشارة إلى أنه قيد السحب.
تتبّع activeDragId للمعاينة
لعرض المحتوى الصحيح في DragOverlay، تتبّع العنصر الذي يجري سحبه حاليًا باستخدام رد النداء onDragStart. خزّن المعرّف النشط في الحالة: setActiveDragId(event.active.id). في onDragEnd، أعد تعيينه إلى null. داخل DragOverlay، استخدم activeDragId للعثور على العنصر الصحيح وعرضه.
دمج العناصر القابلة للسحب والإفلات
تجمع واجهة السحب والإفلات الحقيقية بين DndContext، وعناصر useDraggable متعددة، ومناطق useDroppable متعددة، وإدارة الحالة لتتبّع موضع كل عنصر. والفكرة الأساسية هي أن dnd-kit يوفر الآليات اللازمة، بينما تقع على عاتقك مهمة تحديث الحالة في onDragEnd وإعادة عرض الواجهة لتعكس الترتيب الجديد.
تطبيق نمط التحويل
ما الأداة المساعدة التي تحوّل كائن transform من useDraggable إلى سلسلة تحويل في CSS؟
مراجعة الدرس: الخطافات الأساسية
يُعد DndContext مركز التنسيق لجميع عمليات السحب في dnd-kit. يوفر useDraggable السمات والمستمعات وsetNodeRef وtransform للعناصر القابلة للسحب. ويوفر useDroppable القيمتين isOver وsetNodeRef لأهداف الإفلات. يمنحك onDragEnd القيمتين event.active.id وevent.over?.id لتحديث الحالة. ويعرض DragOverlay معاينة عائمة تستند إلى بوابة.
الأسئلة الشائعة
هل درس «DndContext وuseDraggable وuseDroppable» مجاني؟
نعم — نص درس «DndContext وuseDraggable وuseDroppable» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «DndContext وuseDraggable وuseDroppable»؟
وصّل موفّر DndContext وأنشئ عناصر قابلة للسحب والإفلات باستخدام hooks الخاصة بها تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «DndContext وuseDraggable وuseDroppable»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بنية dnd-kit والتصميم الذي يقدّم إتاحة الوصول أولًا
- DndContext وuseDraggable وuseDroppable
- SortableContext للقوائم القابلة لإعادة الترتيب
- طبقات السحب المخصصة والسحب والإفلات متعدد الحاويات