Superposiciones de arrastre personalizadas y DnD entre contenedores
Renderizar vistas previas de arrastre personalizadas con DragOverlay e implementar interacciones de arrastre entre contenedores al estilo kanban
Superposiciones de arrastre personalizadas y DnD entre contenedores es una lección gratuita de React Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.
DragOverlay como portal
DragOverlay renderiza su contenido como un portal de React y lo añade directamente a document.body, en lugar de hacerlo dentro del árbol DOM de DndContext. Esto significa que nunca queda recortado por contenedores con overflow:hidden u overflow:scroll y que siempre aparece por encima de los demás elementos sin necesidad de gestionar manualmente z-index.
Independencia visual del overlay
Como DragOverlay está separado del elemento original, puede tener estilos visuales que alterarían el diseño si se aplicaran al elemento original. Puede añadir una sombra, una transformación de escala (hacerlo ligeramente más grande que el original) o un efecto de rotación. Estas señales visuales comunican al usuario que el elemento está "elevado" y en movimiento.
Seguimiento de activeDragId
DragOverlay necesita saber qué debe renderizar. Realice un seguimiento del ID del arrastre activo en el estado: establézcalo en onDragStart con event.active.id y elimínelo en onDragEnd con null. Dentro de DragOverlay, use ese ID para buscar los datos del elemento correspondiente y renderizar el componente de vista previa correcto.
Marcador de posición en la posición original
Al utilizar DragOverlay, el elemento arrastrable original debe convertirse en un marcador de posición visual durante el arrastre. Si utiliza useSortable, aplique opacity: 0 o un borde discontinuo cuando isDragging sea true. Esto muestra el "espacio" al que volvería el elemento si se cancelara el arrastre y el hueco que deja al moverse a una nueva posición.
Configuración de DnD con varios contenedores
Arrastrar y soltar entre varios contenedores significa que los elementos pueden arrastrarse entre dos o más listas independientes. La configuración requiere un único DndContext que envuelva todos los contenedores, y cada contenedor debe tener su propio SortableContext. Todos los IDs de los elementos de todos los contenedores deben ser únicos globalmente para evitar colisiones.
Uso de onDragOver para mover elementos entre contenedores
Para obtener una animación fluida entre contenedores, actualice el estado en onDragOver en lugar de esperar a onDragEnd. Cuando el elemento arrastrado entra en un contenedor nuevo, muévalo inmediatamente del contenedor de origen al contenedor de destino. Esto proporciona información visual en tiempo real sobre dónde aterrizará el elemento.
IDs únicos en todos los contenedores
Al arrastrar entre varias instancias de SortableContext, todos los IDs de los elementos deben ser únicos en todo DndContext, no solo dentro de cada lista. Si dos contenedores comparten un ID, dnd-kit no puede determinar qué elemento está activo. Utilice UUID o añada como prefijo el nombre del contenedor a los IDs para garantizar su unicidad global.
active.data.current para metadatos personalizados
useDraggable y useSortable aceptan una opción data: useSortable({ id, data: { containerId, type } }). Estos datos están disponibles en las funciones de devolución de llamada de los eventos de arrastre como event.active.data.current. En escenarios con varios contenedores, puede almacenar el ID del contenedor de origen en data y utilizarlo en onDragOver para saber de dónde procede el elemento.
Actualización del estado de los contenedores durante el arrastre
El estado de varios contenedores suele utilizar un objeto cuyas claves son los IDs de los contenedores y cuyo valor para cada clave es un array de elementos. En onDragOver, cuando el elemento activo está en un contenedor diferente del destino sobre el que se encuentra, elimine el elemento del array del contenedor de origen e insértelo en el array del contenedor de destino en la posición correcta.
Navegación accesible entre varios contenedores
KeyboardSensor funciona con DnD entre varios contenedores. Los usuarios pulsan las teclas de flecha para moverse entre los elementos de un contenedor y, cuando llegan al borde de un contenedor, pueden continuar hacia los contenedores adyacentes. El algoritmo collisionDetection de SortableContext determina el destino válido más cercano según la posición.
Algoritmos de detección de colisiones
DndContext acepta una propiedad collisionDetection que determina cómo calcula sobre qué elemento droppable se encuentra el elemento arrastrado. La opción predeterminada closestCenter funciona bien para la mayoría de las listas. closestCorners es mejor para las cuadrículas. pointerWithin solo activa un elemento droppable cuando el cursor está físicamente dentro de él.
Comportamiento del portal de DragOverlay
¿Dónde renderiza DragOverlay su contenido en el DOM?
Resumen de la lección: overlays y varios contenedores
DragOverlay se renderiza como un portal en document.body, lo que proporciona independencia visual respecto a las restricciones del diseño. Realice un seguimiento de activeDragId en onDragStart/onDragEnd para renderizar el contenido correcto del overlay. El DnD entre varios contenedores utiliza varias instancias de SortableContext dentro de un único DndContext, con IDs únicos globalmente. Actualice el estado en onDragOver para obtener animaciones fluidas entre contenedores, utilizando event.active.data.current para los metadatos del contenedor de origen.
Preguntas frecuentes
¿La lección «Superposiciones de arrastre personalizadas y DnD entre contenedores» es gratis?
Sí — el texto completo de «Superposiciones de arrastre personalizadas y DnD entre contenedores» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Superposiciones de arrastre personalizadas y DnD entre contenedores»?
Renderizar vistas previas de arrastre personalizadas con DragOverlay e implementar interacciones de arrastre entre contenedores al estilo kanban Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar React Academy?
No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Superposiciones de arrastre personalizadas y DnD entre contenedores»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de React Academy?
Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Arquitectura de dnd-kit y diseño centrado en la accesibilidad
- DndContext, useDraggable y useDroppable
- SortableContext para listas reordenables
- Superposiciones de arrastre personalizadas y DnD entre contenedores