Sobreposições personalizadas de arraste e DnD entre vários contêineres
Renderize prévias personalizadas de arraste com DragOverlay e implemente interações de arraste entre contêineres no estilo kanban.
Sobreposições personalizadas de arraste e DnD entre vários contêineres é uma aula grátis de React Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.
DragOverlay como portal
DragOverlay renderiza seu conteúdo como um portal do React, adicionando-o diretamente a document.body em vez de colocá-lo dentro da árvore DOM do DndContext. Isso significa que ele nunca é recortado por contêineres com overflow:hidden ou overflow:scroll e sempre aparece acima de todos os outros elementos, sem exigir gerenciamento manual de z-index.
Independência visual da sobreposição
Como DragOverlay é separado do elemento original, ele pode ter estilos visuais que prejudicariam o layout se fossem aplicados ao original. Você pode adicionar uma sombra projetada, uma transformação de escala (deixando-o um pouco maior que o original) ou um efeito de rotação. Essas pistas visuais comunicam ao usuário que o item foi "levantado" e está em movimento.
Rastreando activeDragId
DragOverlay precisa saber o que renderizar. Acompanhe o ID do arrasto ativo no estado: defina-o em onDragStart com event.active.id e limpe-o em onDragEnd com null. Dentro de DragOverlay, use esse ID para localizar os dados do item correspondente e renderizar o componente de visualização correto.
Espaço reservado na posição original
Ao usar DragOverlay, o item arrastável original deve se tornar um espaço reservado visual durante o arrasto. Ao usar useSortable, aplique opacity: 0 ou uma borda tracejada quando isDragging for verdadeiro. Isso mostra o "espaço" ao qual o item retornará se o arrasto for cancelado e a lacuna que ele deixa ao ser movido para uma nova posição.
Configuração de arrastar e soltar em vários contêineres
Arrastar e soltar em vários contêineres significa que os itens podem ser arrastados entre duas ou mais listas separadas. A configuração exige um único DndContext envolvendo todos os contêineres, com cada contêiner tendo seu próprio SortableContext. Todos os IDs de itens em todos os contêineres devem ser globalmente exclusivos para evitar colisões.
Usando onDragOver para mover entre contêineres
Para obter uma animação suave entre contêineres, atualize o estado em onDragOver em vez de esperar por onDragEnd. Quando o item arrastado entrar em um novo contêiner, mova-o imediatamente do contêiner de origem para o contêiner de destino. Isso fornece feedback visual em tempo real sobre onde o item será colocado.
IDs exclusivos em todos os contêineres
Ao arrastar entre várias instâncias de SortableContext, todos os IDs de itens devem ser exclusivos em todo o DndContext — não apenas dentro de cada lista. Se dois contêineres compartilharem um ID, dnd-kit não poderá determinar qual item está ativo. Use UUIDs ou prefixe os IDs com o nome do contêiner para garantir a exclusividade global.
active.data.current para metadados personalizados
useDraggable e useSortable aceitam uma opção data: useSortable({ id, data: { containerId, type } }). Esses dados ficam disponíveis nas funções de retorno dos eventos de arrasto como event.active.data.current. Em cenários com vários contêineres, você pode armazenar o ID do contêiner de origem nos dados e usá-lo em onDragOver para saber de onde o item está vindo.
Atualizando o estado dos contêineres durante o arrasto
O estado de vários contêineres normalmente usa um objeto indexado pelo ID do contêiner, em que cada entrada contém uma matriz de itens. Em onDragOver, quando o item ativo estiver em um contêiner diferente daquele do alvo sob o qual ele está, remova o item da matriz do contêiner de origem e insira-o na matriz do contêiner de destino na posição correta.
Navegação acessível entre vários contêineres
KeyboardSensor funciona com arrastar e soltar em vários contêineres. Os usuários pressionam as teclas de seta para mover-se entre os itens dentro de um contêiner e, ao chegar à borda de um contêiner, podem continuar para os contêineres adjacentes. O algoritmo collisionDetection de SortableContext determina o destino de soltura válido mais próximo com base na posição.
Algoritmos de detecção de colisão
DndContext aceita uma propriedade collisionDetection que determina como ele calcula sobre qual área de soltura o item arrastado está. O padrão closestCenter funciona bem para a maioria das listas. closestCorners é melhor para grades. pointerWithin só ativa uma área de soltura quando o cursor está fisicamente dentro dela.
Comportamento do portal DragOverlay
Onde DragOverlay renderiza seu conteúdo no DOM?
Recapitulação da lição: sobreposições e vários contêineres
DragOverlay é renderizado como um portal para document.body, proporcionando independência visual em relação às restrições do layout. Acompanhe activeDragId em onDragStart/onDragEnd para renderizar o conteúdo correto da sobreposição. O arrastar e soltar em vários contêineres usa várias instâncias de SortableContext dentro de um único DndContext, com IDs globalmente exclusivos. Atualize o estado em onDragOver para obter animações suaves entre contêineres, usando event.active.data.current para os metadados do contêiner de origem.
Perguntas Frequentes
A aula “Sobreposições personalizadas de arraste e DnD entre vários contêineres” é grátis?
Sim — o texto completo de “Sobreposições personalizadas de arraste e DnD entre vários contêineres” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.
O que vou aprender em “Sobreposições personalizadas de arraste e DnD entre vários contêineres”?
Renderize prévias personalizadas de arraste com DragOverlay e implemente interações de arraste entre contêineres no estilo kanban. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar React Academy?
Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Sobreposições personalizadas de arraste e DnD entre vários contêineres”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de React Academy?
Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Arquitetura do dnd-kit e design priorizando a acessibilidade
- DndContext, useDraggable e useDroppable
- SortableContext para listas reordenáveis
- Sobreposições personalizadas de arraste e DnD entre vários contêineres