@dnd-kit-svelte/svelte

中文文档
0.2.0发布于 2026/11/05MITTypeScriptES Module构建来源已验证近 30 天下载 4.6万

svelte 5 的 dnd- kit : 可拖放、可滴放和可排序的原始人, 拖放的叠加和修饰器, 建于 @ dnd- kit/ dom 有 runes 和附件

中文使用文档
文档目录6 节
  1. 安装
  2. 快开始
  3. 与反应的区别
  4. API 密码
  5. 发展
  6. 许可证

dnd-kit- svelte (英语)

npm

dnd 工具包 svelte 5: 可拖动、可滴放和可排序的原始人, 拖动 覆盖和修改器,以 @dnd-kit/dom 带有遗言和附件。 API跟着 @dnd-kit/react因此,它的文档适用于这里, 与斯维尔特 差异.

文件和实例

安装

npm i @dnd-kit-svelte/svelte

要求斯维尔特5.40或以后。 帮助者,例如: move 来自 @dnd-kit/helpers; 插件, 如 Feedback 从 @dnd-kit/dom。 。 。 .

快开始

Hooks通过上下文找到他们的管理器,所以在内部的组件中召唤他们 DragDropProvider。 。 。 .

<!-- draggable.svelte -->
<script lang="ts">
    import { useDraggable } from "@dnd-kit-svelte/svelte";

    const { ref } = useDraggable({ id: "draggable" });
</script>

<button {@attach ref}>Drag me</button>
<!-- droppable.svelte -->
<script lang="ts">
    import { useDroppable } from "@dnd-kit-svelte/svelte";
    import type { Snippet } from "svelte";

    let { id, children }: { id: string; children?: Snippet } = $props();

    const { ref, isDropTarget } = useDroppable({ id: () => id });
</script>

<div {@attach ref} data-over={isDropTarget.current}>
    {@render children?.()}
</div>
<script lang="ts">
    import { DragDropProvider } from "@dnd-kit-svelte/svelte";
    import Draggable from "./draggable.svelte";
    import Droppable from "./droppable.svelte";

    let dropped = $state(false);
</script>

<DragDropProvider onDragEnd={(event) => !event.canceled && (dropped = event.operation.target?.id === "droppable")}>
    {#if !dropped}
        <Draggable />
    {/if}

    <Droppable id="droppable">
        {#if dropped}
            <Draggable />
        {/if}
    </Droppable>
</DragDropProvider>

可排序列表 :

<!-- sortable-item.svelte -->
<script lang="ts">
    import { useSortable } from "@dnd-kit-svelte/svelte/sortable";

    let { id, index }: { id: string; index: number } = $props();

    const { ref, isDragging } = useSortable({ id: () => id, index: () => index });
</script>

<li {@attach ref} data-dragging={isDragging.current}>{id}</li>
<script lang="ts">
    import { DragDropProvider } from "@dnd-kit-svelte/svelte";
    import { move } from "@dnd-kit/helpers";
    import SortableItem from "./sortable-item.svelte";

    let items = $state(["a", "b", "c"]);
</script>

<DragDropProvider onDragOver={(event) => (items = move(items, event))}>
    <ul>
        {#each items as id, index (id)}
            <SortableItem {id} {index} />
        {/each}
    </ul>
</DragDropProvider>

当每个项目为一个元素时,您可以跳过其组件并调用一个 {const …} 内部标记 {#each} (Svelte 5.56或后期):

<script lang="ts">
    import { DragDropProvider } from "@dnd-kit-svelte/svelte";
    import { useSortable } from "@dnd-kit-svelte/svelte/sortable";
    import { move } from "@dnd-kit/helpers";

    let items = $state(["a", "b", "c"]);
</script>

<DragDropProvider onDragOver={(event) => (items = move(items, event))}>
    <ul>
        {#each items as id, index (id)}
            {const { ref } = useSortable({ id, index: () => index })}
            <li {@attach ref}>{id}</li>
        {/each}
    </ul>
</DragDropProvider>

与反应的区别

Svelte 组件不重接, 因此值会改变到钩子作为函数, 值会改变钩子 产品读取通过 .current。 。 。 .

输入是值或得到数. 任何输入字段都可以是一个值,读一次,或者一个函数返回它,读一次 当变化时:

useSortable({
    id: item.id, // fixed
    index: () => index, // follows `index`
    data: () => item,
});

Getter 属性 (get index() { return index; }),而一个组件的剩余道具工作方式相同. 一个田地 值本身是一个函数(accept, (中文(简体) ), collisionDetector, (中文(简体) ), plugins: (defaults) => …)必须被包裹在一个得到的:

import { Feedback } from "@dnd-kit/dom";

useSortable({
    id,
    index: () => index,
    plugins: () => (defaults) => [...defaults, Feedback.configure({ feedback: "clone" })],
});

状态读取通过 .current。 。 。 . isDragging, (中文(简体) ), isDropping, (中文(简体) ), isDragSource 财务报告和审定财务报表 isDropTarget 为: 镜头(Lens<boolean>- 他们 current 自行更新模板.

<div {@attach ref}>{isDragging.current ? "Dragging" : "Idle"}</div>

注释为附件. ref, (中文(简体) ), handleRef, (中文(简体) ), sourceRef 财务报告和审定财务报表 targetRef 继续使用元素 {@attach}。 。 。 .

列表按状态排序 . {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}dnd kid's OptimisticSortingPlugin 拖动时重排序 DOM 节点, 此节点按键 {#each} 无法恢复,所以 useSortable 离开默认插件( 退出默认插件 a) plugins: () => (defaults) => … 呼叫回收). 移动项目到 onDragOver 如上,在拖曳时排序,或 内 onDragEnd 在滴水时排序。 以同样方式排序列或组, 其阵列处于状态 .

DragOverlay 做一个片段. 它接收到拖曳源 :

<DragOverlay>
    {#snippet children(source)}
        <Item id={source.id} />
    {/snippet}
</DragOverlay>

API 密码

导出从
DragDropProvider, (中文(简体) ), DragOverlay@dnd-kit-svelte/svelte
useDraggable, (中文(简体) ), useDroppable@dnd-kit-svelte/svelte
useDragDropManager, (中文(简体) ), useDragDropMonitor, (中文(简体) ), useDragOperation, (中文(简体) ), useInstance@dnd-kit-svelte/svelte
KeyboardSensor, (中文(简体) ), PointerSensor,事件类型(DragEndEvent. ) (中文(简体) )@dnd-kit-svelte/svelte
useSortable, (中文(简体) ), isSortable, (中文(简体) ), isSortableOperation@dnd-kit-svelte/svelte/sortable
dnd工具包的修饰器, SnapCenterToCursor, (中文(简体) ), AlignTopLeftToCursor, (中文(简体) ), OffsetBottomRight@dnd-kit-svelte/svelte/modifiers

每个人的行为,都看 文档。 。 。 .

发展

这是 Bun 工作空间: 软件包位于 packages/svelte中,示例网站 docs。 。 。 .

bun install
bun run dev    # the package in watch mode and the examples site
bun run check  # build and type-check everything

许可证

麻省理工学院 哈尼埃尔·乌博古。包含根据dnd工具包改编的代码,参见 注意到.txt。 。 。 .

版本与发布记录

@dnd-kit-svelte/svelte 共发布 8 个版本,首次发布于 2025/09/04;过去 12 个月发布了 4 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.2.0latest2026/11/058 天前
0.1.62026/02/069 个月前
0.1.52025/11/2011 个月前
0.1.42025/11/2011 个月前
0.1.32025/09/071.2 年前
0.1.22025/09/071.2 年前

关于 @dnd-kit-svelte/svelte 的常见问题

@dnd-kit-svelte/svelte 是什么?

svelte 5 的 dnd- kit : 可拖放、可滴放和可排序的原始人, 拖放的叠加和修饰器, 建于 @ dnd- kit/ dom 有 runes 和附件

如何安装 @dnd-kit-svelte/svelte?

在项目目录运行 npm install @dnd-kit-svelte/svelte,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:svelte(^5.40.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@dnd-kit-svelte/svelte 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@dnd-kit-svelte/svelte 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@dnd-kit-svelte/svelte 可以商用吗?

@dnd-kit-svelte/svelte 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@dnd-kit-svelte/svelte 的下载量有多少?

根据 npm 官方下载统计,@dnd-kit-svelte/svelte 在 2026/10/13 – 2026/11/11 这 30 天内被下载 46,105 次,日均约 1,537 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@dnd-kit-svelte/svelte 还在维护吗?

最新版本 0.2.0 发布于 2026/11/05(8 天前);至今共发布 8 个版本,其中过去 12 个月发布了 4 个;首次发布于 2025/09/04。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。