Documentação/Guias
DevTools
Uma aba Vue DnD Kit no Vue DevTools e no Nuxt DevTools — um minimapa ao vivo, um joystick que arrasta de verdade, edição de opções ao vivo e um log de cada arraste.
Esta página foi traduzida por IA e pode conter imprecisões. Ler o original em inglês
@vue-dnd-kit/devtools adiciona uma aba Vue DnD Kit ao Vue DevTools (vite-plugin-vue-devtools)
e ao Nuxt DevTools. Ela mostra todas as listas, árvores e alvos de drop da página em um minimapa ao
vivo, arrasta qualquer item com um joystick, edita opções enquanto o app roda e registra o que cada
arraste fez. Ela só funciona em desenvolvimento: nada dela chega a um build de produção.
A aba é uma página própria, servida pelo seu servidor de desenvolvimento ao lado do seu app, então ela não pode rodar dentro desta documentação. Três passos a configuram.
Instalação
1. Adicione os pacotes
npm i -D @vue-dnd-kit/devtools @vue-dnd-kit/actions
@vue-dnd-kit/actions é uma peer dependency: os movimentos da aba passam por ele. O npm 7+ e o
pnpm o instalam sozinhos; com o Yarn 1, adicione-o.
2. Adicione o plugin
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueDevTools from 'vite-plugin-vue-devtools';
import { vueDnDKitDevtools } from '@vue-dnd-kit/devtools/vite';
export default defineConfig({
// Next to the Vue DevTools plugin: the tab joins its sidebar.
plugins: [vueDevTools(), vueDnDKitDevtools(), vue()],
});
export default defineNuxtConfig({
// With @vue-dnd-kit/devtools installed, the tab appears in development.
modules: ['@vue-dnd-kit/nuxt'],
});
Com o Vite, o plugin faz três coisas no servidor de desenvolvimento (vite serve): serve a aba em
/__vue-dnd-kit-devtools/ (sob a sua base), a adiciona ao Vue DevTools e faz a página se
reportar a ela antes de o seu app começar. Nenhum app.use() é necessário, e os builds não são
afetados.
Com o Nuxt, o módulo @vue-dnd-kit/nuxt encontra o pacote, serve a aba, a adiciona ao Nuxt
DevTools e instala o lado da página com um plugin de cliente. vueDndKit: { devtools: false } a
desliga.
3. Rode o app em desenvolvimento
Inicie o servidor de desenvolvimento como sempre (vite, nuxt dev) e abra o app: a aba está
pronta. Todo provider da página aparece nela, seja qual for o app em que ele é renderizado.
Sem os plugins
Para um servidor de desenvolvimento seu, ou uma página que o Vite não serve a partir de um
index.html (configurações de SSR), instale o lado da página você mesmo:
import { createApp } from 'vue';
import { DnDDevtools } from '@vue-dnd-kit/devtools';
import App from './App.vue';
const app = createApp(App);
app.use(DnDDevtools); // before mount: providers set up earlier aren't seen
app.mount('#app');
Ou importe @vue-dnd-kit/devtools/auto primeiro no arquivo de entrada. Use
vueDnDKitDevtools({ inject: false }) quando o plugin deve servir a aba, mas você instala o lado da
página você mesmo; serveTab() de @vue-dnd-kit/devtools/vite é o middleware que serve a aba.
app.use(DnDDevtools) e o import auto encolhem para quase nada: todo
ponto de entrada verifica process.env.NODE_ENV primeiro, e os bundlers descartam o resto. No
servidor, eles não fazem nada.Abrir a aba
- Vue DevTools: Alt + Shift + D, ou o botão do Vue no rodapé da página, depois a aba Vue DnD Kit.
- Nuxt DevTools: Alt + Shift + D, ou o botão do Nuxt, depois Vue DnD Kit (na barra lateral ou no menu de itens extras dela).
- Uma janela própria: abra
http://localhost:5173/__vue-dnd-kit-devtools/no seu servidor de desenvolvimento, ou o botão ⧉ da aba. Prático em um segundo monitor. Com várias páginas abertas, um seletor no topo escolhe qual observar.
A aba em resumo
| Parte | O que contém |
|---|---|
| Barra superior | O que o arraste está fazendo agora (dragging card-3 → done (accepts)), a página observada, ⌖ Pick, a contagem de opções editadas com um reset, ⧉ (uma janela própria) e o tema. |
| Esquerda: o registro | Todo provider como uma árvore: as listas, árvores, alvos de drop e draggables dele. ☰ o mostra ou esconde. |
| Meio: Map e Log | O minimapa ao vivo da página, ou o log dos arrastes. |
| Direita: Drive, Options, State | O joystick e os botões de mover, as opções do nó escolhido, e o que o provider sabe sobre ele. |
Escolha um nó no registro ou um item no mapa, e o lado direito o acompanha.
O minimapa
Um card ao vivo por lista, árvore e alvo de drop, com cópias dos itens deles onde estão — os mesmos clones que o overlay mostraria, com o CSS da página. Durante um arraste, ele marca:
- as listas e os alvos que aceitam o arraste (azul) ou o recusam (vermelho);
- o placeholder, e o alvo sob o ponteiro;
- o ponteiro, a caixa do overlay e a linha de inserção das listas com
placeholder: 'indicator'.
Um clique escolhe um item e o destaca na página; um clique duplo rola a página até ele. Use o mapa quando um drop não vai para onde você espera: ele mostra de relance quais listas aceitam o arraste.
Drive: o joystick
Escolha um item — no mapa, no registro ou com ⌖ Pick, que captura a próxima pressão em um draggable da página em vez de deixá-la agir — e empurre a alavanca do joystick. O item é pego e se move naquela direção, mais rápido quanto mais longe a alavanca estiver do centro. Solte e ele para; Drop e Cancel encerram o arraste.
É um arraste por ponteiro de verdade de um sensor chamado devtools, feito com a
API pública de sensores: as listas ordenam sob ele, os
contêineres rolam automaticamente nas bordas, e onBeforeDrop e onDrop rodam como em qualquer
arraste. Itens desativados não são pegos. Um arraste por teclado iniciado pela página também pode
ser conduzido.
Os itens de listas ordenáveis também ganham botões: para cima, para baixo, para o início, para o
fim, para outra lista do grupo. Cada um é um arraste por teclado de
moveItem. Embaixo do joystick, uma cópia grande do que o
overlay mostra.
| Tecla, na aba | Faz |
|---|---|
| Setas ou W A S D | Empurra a alavanca naquela direção, até a metade; com Shift, até o fim |
| G | Pega o item escolhido |
| Space / Enter | Solta |
| Escape | Cancela |
| P | Escolhe na página |
Opções
Toda opção que não é um callback pode ser editada enquanto o app roda. Escolha o nó e abra Options:
| Nó | Opções |
|---|---|
| Provider | overlayFit, autoScroll, collision, modifiers (os da biblioteca, pelo nome), animation, dropAnimation, animateChanges, activation, keyboard, haptics, copyModifier… |
| Lista | disabled, strategy, placeholder, behavior, multiple, sort, dropOutside, acceptMode, animation, animateChanges, autoScroll, modifiers |
| Árvore | placeholder, indentation, nesting, maxDepth… |
| Alvo de drop | disabled, priority, accept, acceptMode |
| Item | disabled, keyboardMode, activation |
Uma edição vale na hora, só para esta página, e nunca é gravada no seu código: a biblioteca lê o novo valor onde lê a opção. Ela dura até você resetá-la (↺ por opção, ou o reset da barra superior), o provider ser desmontado ou a página recarregar. Uma opção editada mostra ao lado o valor do seu código. Os itens montados enquanto uma edição está ativa — linhas de uma lista virtual — também a recebem.
Estado
O que cada provider sabe, para o nó que você escolheu:
- a sessão de arraste: o status, os ids, os itens e o sensor ativos, o alvo e se ele aceita, o ponteiro, o overlay, a sessão do grupo ordenável e a linha de inserção;
- uma lista: a ordem dela e o rascunho; uma árvore: as linhas dela;
- um item: o tipo, os dados e a posição dele; um alvo de drop: as regras dele.
Os itens são montados e desmontados sem eventos: o registro se atualiza em até um segundo.
Log
Uma faixa por arraste, em ordem:
| Entrada | O que diz |
|---|---|
drag start | Os ids, o sensor e se foi por toque, a lista de onde vem. |
over, left | Cada alvo em que entrou e de que saiu, e se ele aceita. |
release | O alvo sobre o qual foi solto, enquanto o onBeforeDrop decide. |
onBeforeDrop | O veredito: aceito, alguns aceitos, rejeitado por um hook, recusado pelo accept do alvo, e quanto tempo os hooks levaram. |
drop | O alvo; para listas ordenáveis, o movimento, e.result, e se preventDefault() foi chamado. |
cancel | O motivo: cancelado (Escape, cancel()), rejeitado por um hook, ou recusado pelo accept do alvo. |
Também auto-scroll on e off, os textos de announcement (escondidos por padrão) e, fora dos
arrastes, animate (mudanças nos itens de uma lista que nenhum arraste fez). Clique em uma entrada
para ver os dados dela. Uma aba aberta depois recebe os arrastes até então.
Depurar um drop, passo a passo
Um card não entra em uma coluna. Com a aba aberta:
- Reproduza à mão, ou com Drive, para que as suas mãos fiquem livres para a aba.
- Observe o mapa enquanto o card está sobre a coluna. Vermelho significa que a lista recusa o
card: veja o
groupdela (put) ou oacceptdo alvo. Azul significa que ela aceita, e o problema vem depois. - Leia o log desse arraste.
onBeforeDropdiz quem disse não — um hook, ou oacceptdo alvo. Se o drop foi concluído mas os seus dados não mudaram, a entradadropdiz sepreventDefault()foi chamado e o quee.resultcontinha: uma lista controlada precisa aplicá-lo ela mesma. - Teste uma correção ao vivo em Options — um
acceptModemais flexível, outracollision,placeholder: 'indicator'— e depois escreva no seu código a que funcionar.
Como funciona
Os providers se reportam a um hook que o lado da página instala. Até uma aba observar a página,
eles só são registrados; depois disso, a página escuta como qualquer monitor e envia à aba o que
ela mostra — a cada 40 ms durante um arraste, duas vezes por segundo no resto do tempo — e para
assim que nenhuma aba a observa por alguns segundos. A aba conversa com a página por um
BroadcastChannel da origem da página. Ela não muda nada além do que você pede: os arrastes, a
seleção e as substituições de opções.