Documentation/API
useDnD et moniteurs
L'état du glissement et ses événements, n'importe où sous le provider — et le provider lui-même, transmis à une autre application Vue.
Cette page a été traduite par IA et peut contenir des inexactitudes. Lire l'original en anglais
Chargement de la démo…
<script setup lang="ts">
import { DnDProvider } from '@vue-dnd-kit/core';
import TokenScene from './TokenScene.vue';
import StateInspector from './StateInspector.vue';
</script>
<template>
<DnDProvider>
<div class="demo">
<TokenScene />
<StateInspector />
</div>
</DnDProvider>
</template>
<style scoped>
.demo {
display: flex;
flex-wrap: wrap;
align-items: flex-start;
justify-content: center;
gap: 16px;
}
</style>useDnD
function useDnD(): DnDState;L'état du glissement en lecture seule, pour une UI personnalisée (mise en évidence des cibles valides, indicateurs de chargement, progression).
const { status, active, over, selection, cancel } = useDnD();
const dragging = computed(() => status.value === 'dragging');
L'état réactif du glissement du provider. active et over sont vidés dès que le dépôt est décidé,
pendant que l'overlay atterrit encore.
L'état du glissement prend fin quand le dépôt est décidé : active, over et pointer valent null (et les droppables cessent d'accepter) pendant que l'overlay s'anime encore jusqu'à sa place. Une UI dérivée ne mélange jamais l'ancien glissement avec les nouvelles données. Pendant qu'un onBeforeDrop asynchrone décide, l'état est conservé tel qu'il était au relâchement, mais la page est sortie du mode glissement : son propre curseur et la sélection de texte sont revenus (une boîte de dialogue de confirmation fonctionne normalement), et l'overlay attend là où il a été déposé.
status vaut 'dragging' pendant qu'un glissement est en cours, sinon 'dropping' pendant qu'un dépôt se décide ou qu'un overlay atterrit encore, sinon 'idle' (hors 'activating' et 'selecting'). Un nouveau glissement n'attend pas les atterrissages : il démarre aussitôt, et ils se terminent autour de lui.
Readonly<Ref<DnDStatus>>Ce que fait le provider (voir DnDStatus).
Readonly<Ref<Active | null>>Le glissement en cours ; null s'il n'y en a pas, et dès que son dépôt est décidé.
Readonly<Ref<Over | null>>La cible de dépôt sous le glissement ; null au-dessus de rien.
Readonly<Ref<Coordinates | null>>Le pointeur en coordonnées du viewport, après les modificateurs ; null sans glissement.
Readonly<Ref<Coordinates | null>>Où se trouve le coin supérieur gauche de la boîte glissée dans over, en direct : DnDEvent.position à chaque déplacement. null au-dessus de rien. Un composant d'overlay le lit pour montrer où il atterrirait (une heure sur un calendrier).
{ progress: Readonly<Ref<number>> }progress : où en est un appui par rapport à sa condition d'activation, de 0 à 1, tant que status vaut 'activating' : par exemple un anneau qui se remplit pendant un appui long.
Readonly<Ref<boolean>>Le défilement automatique fait défiler un conteneur.
DnDSelectionLes éléments déplaçables sélectionnés (voir DnDSelection).
() => voidAnnule le glissement (il revient à sa place), ou l'activation en attente.
Sélection
Les éléments déplaçables sélectionnés, par id : glisser l'un d'eux les emporte tous (multi-drag). Conservée par id, une sélection survit aux démontages (listes virtuelles).
ReadonlySet<Key>Les ids sélectionnés, réactifs.
(id: Key) => booleanSi id est sélectionné.
(...ids: Key[]) => voidSélectionne ces ids.
(...ids: Key[]) => voidDésélectionne ces ids.
(id: Key, force?: boolean) => voidSélectionne id ou le désélectionne ; force: true le sélectionne, false le désélectionne.
(ids: Iterable<Key>) => voidSélectionne ces ids et aucun autre.
() => voidDésélectionne tous les ids.
useDnDMonitor
function useDnDMonitor(monitor: DnDMonitor): void;S'abonne aux événements de chaque glissement sous le provider, tant que le composant appelant (ou l'effect scope) existe.
useDnDMonitor({
onDragEnd: (e) => (e.dropped ? save(e) : undefined),
onBeforeDrop: async (e) => ((await confirm()) ? 'accept' : 'reject'),
});
Vos moniteurs sont consultés sur un dépôt (onBeforeDrop) avant la cible. Les payloads sont
décrits sur la page des événements.
Des hooks pour chaque glissement sous le provider (useDnDMonitor).
(event: DnDEvent) => voidUn glissement a commencé, après son activation.
(event: DnDEvent) => voidLe glissement a bougé (au plus une fois par image).
(event: DnDEvent) => voidLa cible sous le glissement a changé.
(event: DnDEvent) => MaybePromise<BeforeDropResult>S'exécute avant que le dépôt ne soit validé (voir BeforeDropResult) : 'reject' le refuse, des ids en acceptent un sous-ensemble.
(event: DnDEndEvent) => voidUne notification une fois le dépôt terminé : les listes triables ont exécuté leur onDrop et l'ont écrit.
(event: DnDEvent) => voidLe glissement a été annulé, ou son dépôt refusé : les items reviennent à leur place.
(event: DnDEvent) => voidonBeforeDrop a répondu 'continue' : il n'y a pas eu de dépôt, et le glissement continue.
(event: DnDEvent | DnDEndEvent) => voidL'overlay d'un glissement terminé a atterri : après son animation de dépôt (ou le retour en vol d'une annulation), avec l'événement qu'a reçu onDragEnd (un DnDEndEvent) ou onDragCancel. Le glissement suivant a pu démarrer entre-temps : les glissements n'attendent pas les atterrissages.
(event: KeyboardEvent, context: KeyboardMoveContext) => MaybePromise<Coordinates | undefined>Glissements au clavier : prochaine position du pointeur pour une flèche (par exemple le prochain emplacement triable).
Ce avec quoi getKeyboardCoordinates est appelé, pour une touche fléchée.
useDnDContext et provideDnDContext
function useDnDContext(): DnDContext;Le provider au-dessus de ce composant, sous forme de handle opaque pour provideDnDContext : il fait passer le provider dans des shadow roots et des applications Vue séparées.
function provideDnDContext(app: App, context: DnDContext): void;Partage un provider (obtenu par useDnDContext()) avec une autre application Vue, par exemple une application montée dans un shadow root.
// In a component under the provider:
const context = useDnDContext();
// A second Vue app (a widget mounted in a shadow root) joins the same drag:
const widget = createApp(Widget);
provideDnDContext(widget, context);
Un provider tel que le renvoie useDnDContext(), à transmettre à provideDnDContext() : une autre application Vue (par exemple montée dans un shadow root) fonctionne alors avec le même provider. Opaque : il n'a aucun membre public, et ne change donc jamais avec les rouages internes de la bibliothèque.