文档/API

DragPreview 与浮层 props

被拖拽项的克隆,用于自行布局多个项的自定义浮层——以及浮层组件收到的 props。

编辑此页

本页由 AI 翻译,可能存在不准确之处。 阅读英文原文

Live

正在加载演示…

<script setup lang="ts">
import { ref } from 'vue';
import { DnDProvider } from '@vue-dnd-kit/core';
import MediaList from './MediaList.vue';

const media = (kind: 'photo' | 'video', n: number, hue: number) => ({ id: `${kind[0]}${n}`, kind, hue });
const library = ref([
  media('photo', 1, 200),
  media('photo', 2, 30),
  media('video', 1, 280),
  media('photo', 3, 140),
  media('photo', 4, 340),
  media('video', 2, 90),
  media('photo', 5, 250),
  media('photo', 6, 10),
]);
const album = ref([media('photo', 7, 170)]);
</script>

<template>
  <DnDProvider>
    <div class="demo">
      <MediaList id="library" v-model="library" title="Library" :columns="4" />
      <!-- Takes photos only: over it with a video, `accepted` is false. -->
      <MediaList id="album" v-model="album" title="Album · photos" :columns="3" photos-only />
    </div>
  </DnDProvider>
</template>

<style scoped>
.demo {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: center;
  align-content: flex-start;
  gap: 14px;
  /* Room above the lists for the overlay's caption, and below for the album to grow into:
     the lists never move under the pointer. */
  min-height: 300px;
  padding-top: 24px;
}
</style>

DragPreview

const DragPreview: Component<DragPreviewProps>;

一个被拖拽项的默认克隆(见 DragPreviewProps)。自定义浮层用它自行排布多个项;默认浮层用它显示多项拖拽。

StackOverlay.vue
<script setup lang="ts">
import { DragPreview, type DragItem } from '@vue-dnd-kit/core';

defineProps<{ items: DragItem[] }>();
</script>

<template>
  <div class="stack">
    <DragPreview v-for="item in items.slice(0, 3)" :id="item.id" :key="item.id" />
  </div>
</template>

克隆在拿起时生成:抓起的项,以及按放置顺序与它相邻的其他项,数量为 provider 的 overlayPreviews(默认 5 个)。对于其他任何项,DragPreview 渲染它的默认插槽,或者什么都不渲染。放置时,每个预览飞向它自己对应的项;放置进某个区域(文件夹、回收站)时,预览依次进入该区域。参见浮层指南。

DragPreview 的 props:某一个被拖拽项的默认克隆,用于自行布局多个项的自定义浮层(overlay 组件或 provider 的 #overlay 插槽),例如 <DragPreview v-for="item in items" :key="item.id" :id="item.id" />。

克隆在拿起时生成:抓起的项,以及按放置顺序与它相邻的其他项,数量为 provider 的 overlayPreviews(默认 5;限于当时已渲染的那些)。对于其他任何项,DragPreview 把它的默认插槽渲染在一个像克隆一样接受 class 和 style 的元素中;没有默认插槽时什么都不渲染。克隆会填满这个元素,元素的尺寸是该项在拿起时的尺寸,以内联样式设置:用 style 修改它(:style="{ width: '100%', height: '100%' }"),style 会透传;class 无法覆盖它。

在可排序的多项拖拽中(multiple: 'group' 或 'gaps'),抓起的项以外的项的预览会随放置落到该项的位置上(取消时回到原处),无论布局把它放在哪里:途中会撤销用 transform 旋转或缩放的包裹元素,它的尺寸以宽度和高度的方式执行动画。为预览本身设置样式(圆角、阴影):它的包裹元素留在盒子里。没有克隆的项则改为淡入。放置进某个区域(而不是列表)时,各个预览依次进入该区域,盒子最后进入。

Key

某个被拖拽项的 id:OverlayProps 中 items 的其中之一。

浮层 props

浮层组件(可拖拽元素、可排序项、列表和树的 overlay 选项)和 provider 的 #overlay 插槽收到的内容。

浮层显示的内容:provider 的 #overlay 插槽和浮层组件(可拖拽元素、可排序项、列表和树的 overlay 选项)的 props。

Active

这次拖拽。

DragItem[]

所有被拖拽的项,主项在最前:整个多项拖拽只用一个浮层。

Over | null

拖拽下方的放置目标。已确定的放置执行动画期间,是它要落到的目标(保持放置那一刻的状态);被取消的拖拽飞回原处时为 null。

boolean

over 是否接收被拖拽的项;下方没有目标时为 false。

DnDStatus

'dragging',然后在浮层落位(或飞回原处)时为 'dropping'。

DragMode

此刻放置会做什么(见 DnDEvent.mode):例如复制时显示一个加号。

DropDestination | null

现在放置会把被拖拽的项放到可排序列表或树中的哪里:例如按树拖拽将进入的文件夹给浮层着色。在所有目标之外,是空位所在的地方,dropOutside: 'placeholder'(默认值)会把它们留在那里。当放置不会把它们放进任何列表时为 null:在普通放置目标上方、在拒绝它们的列表上方、在 dropOutside: 'cancel' 或 'remove' 时位于目标之外。已确定的放置执行动画期间,是它落到的位置。

浮层组件的 props,用于 defineProps<OverlayProps>()。

组件渲染在浮层盒子内部,盒子跟随位置的尺寸(overlayFit: 'slot'),并在放置时以动画方式变化。给根元素设置 width: 100%(以及 height: 100%)以跟随这个尺寸;固定尺寸会保持组件自己的尺寸。

type OverlayProps = OverlaySlotProps

放置会把被拖拽的项放到哪里:可排序列表或树中的一个位置,与放置事件的 to 将给出的一致(即浮层的 to prop,实时更新)。

Key

列表或树的 id。

number

被拖拽的项所占的索引:在列表中,或在树中 parentKey 下的兄弟节点之间。

Key | null

树:它们将放到其下的节点;在根层级时为 null。

number

树:它们将处于的深度(根节点为 0)。