文档/API

makeSortableTree

让容器成为可排序树,以带深度的扁平形式渲染——通过横向拖动或悬停在节点上来嵌套。

编辑此页

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

function makeSortableTree<T>(  target: MaybeElementRef,  options: SortableTreeOptions<T>,): SortableTreeReturn<T>;

让容器成为可排序树。用调用 makeSortableItem 的行组件渲染返回的 items(草稿顺序中的可见节点,按 depth 缩进)。放置时,在 onDrop 之后,被移动的节点(连同它们的子树)会写入 options.items,除非 event.preventDefault() 把 event.result 留给你处理。

const root = useTemplateRef<HTMLElement>('root');
const { items } = makeSortableTree(root, { items: files, indentation: 20, collapsed });

每一行都以 id: () => node.key 调用 makeSortableItem。参见树。

Live

正在加载演示…

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

<template>
  <DnDProvider>
    <FileTree />
  </DnDProvider>
</template>

选项

makeSortableTree 的选项。多项拖拽会把选中的节点作为一个整体移动,各自带着子树,移到同一个位置和深度(按文档顺序);位于另一个选中节点内部的选中节点会随其子树一起移动。抓起的节点也是如此(与 VS Code 一样):它留在它所在的那个选中节点内部,跟随该节点及其子树一起移动,而浮层显示的仍是抓起的那一行。canNest 和 maxDepth 作用于整个整体。

其他选项的含义与 makeSortableList 上的相同。它们接受值、ref 或 getter(overlay、overOverlay、animation、dropAnimation、overDropAnimation:值或 ref),并在树需要时读取,所以变化最迟在下一次拖拽时生效。例外:id 和 group 只在创建树时读取一次;items 就是模型本身;函数(getKey、getChildren、setChildren、canNest、clone、createItem、各个回调)按原样传入。

SortableItems<T>

根节点。可写的 ref:放置时,库会给发生变化的节点设置新的子节点(setChildren),并写入一个新的根数组。只读的数据源(getter、只读 ref、computed):调用 event.preventDefault(),自己应用 event.result(与 SortableListOptions.items 相同)。

(node: T) => Key

默认:node.id。也用于为 makeSortableItem({ item })、副本和新创建的节点生成 key。

(node: T) => T[]

节点的子节点。默认:node.children。

(node: T, children: T[]) => void

默认写入如何给节点设置新的子节点。默认:node.children = children。

(node: T, children: T[]) => T

带有 children 的 node 副本,用于 event.result:一棵保留你原有节点不变的新树(默认写入仍通过 setChildren 完成)。默认:通过 setChildren 设置了子节点的 { ...node }(没有 setChildren 时为 { ...node, children })。对于类实例,以及需要比浅拷贝更多处理的节点,传入它。

Key

默认:useId(),在服务端和客户端渲染之间保持稳定。只读取一次。

string值 · ref · getter

人们对树的称呼:屏幕阅读器文本会说出它,而不是树的 id。

unknown值 · ref · getter

关于这棵树作为放置目标的任何信息:拖拽位于它上方时,事件以 over.data 携带它。

ActivationOptions值 · ref · getter

在这棵树的行上按下时如何开始拖拽,替代 provider 的 activation(行自己的优先)。

Component值 · ref

这棵树中行的浮层组件(行自己的 overlay 优先)。在拖拽过程中切换的 ref 会立即替换它。

Component值 · ref

当这棵树接受的拖拽位于它上方时浮层显示什么(见 SortableListOptions.overOverlay)。它的 to prop 说明放置会嵌套到哪里。

DropAnimation值 · ref

这棵树中行的拖拽结束时浮层如何落位(见 SortableListOptions.dropAnimation)。

DropAnimation值 · ref

浮层被放进这棵树时如何落位(见 SortableListOptions.overDropAnimation)。

Modifier[]值 · ref · getter

这棵树中行的拖拽修饰器,在 provider 的 modifiers 之后应用(行自己的 modifiers 优先):例如 [restrictToVerticalAxis]。在拖拽开始时读取。锁定轴向后仍然可以嵌套:此时深度来自悬停在某一行的中间。

'x' | 'y'值 · ref · getter

在修饰器之后,把这棵树中行的拖拽锁定在一个轴上(行自己的 axis 优先)。使用 'y' 时行仍然可以嵌套:此时深度来自悬停在某一行的中间。在拖拽开始时读取。

string | SortableGroupOptions<T>

分组名称相同的列表和树会互相交换项。默认:自成一组。只读取一次。

AcceptMode值 · ref · getter

多种类型项的多项拖拽:全部('all',默认)还是部分('some')项必须被接受(group.put)。

number值 · ref · getter

每一级深度对应的水平偏移像素数。默认 24。

TreeNesting值 · ref · getter

如何选择深度:水平偏移、悬停在某一行的中间,或两者兼用(默认)。

SortablePlaceholder值 · ref · getter

'item'(默认):被拖拽的节点以预测的深度在行之间移动。'indicator':树不移动;indicator(在树上以及每一行的 makeSortableItem 上)指出放置的位置,以及它的 depth 和 parentKey,插入线由你来画。此时放到外面会取消。

number值 · ref · getter

允许的最大深度(根节点为 0)。被拖拽节点自己的后代也计算在内。

(node: T, parent: T) => boolean

node 能否放到 parent 之下;多项拖拽时会对每个被拖拽的节点询问。

ReadonlySet<Key>值 · ref · getter

子节点被隐藏的节点的 key。

(node: T) => T

创建副本(group.pull: 'clone'、复制修饰键)。复制时必需。返回带有整棵子树的副本:被复制的文件夹会保留它的子节点。副本及其每个后代都需要自己的 key(用 getKey 读取),就像树中的每个节点一样。

(active: Active) => T

接收来自外部的普通可拖拽元素:在预测的位置和深度创建要插入的节点(canNest 和 maxDepth 对它同样适用)。使用键盘时,朝树的方向按方向键即可把可拖拽元素放进来,与它将插入其前方的那一行平齐,之后方向键会像移动其他节点一样移动这个节点。来自页面之外的拖拽(external)会被询问两次,拖拽进行时和放置时各一次(见列表的 createItem);一个为每个文件带一个子节点的文件夹节点可以容纳多个文件。

ExternalAccept值 · ref · getter

接收来自页面之外的拖拽:文件、链接、文本(见 ExternalAccept),配合 createItem。从应用另一个窗口拖进来的同一分组的节点以自身进入。值、ref 或 getter,实时读取。

DropOutside值 · ref · getter

放在所有目标之外时:把节点留在占位所在的地方、取消,或者移除它们。默认为 'placeholder'(使用 placeholder: 'indicator' 时为 'cancel')。在放置时读取。

LayoutAnimation值 · ref

这棵树的 FLIP 动画;默认:provider 的 animation。值或 ref(函数即自定义动画)。

AutoAnimation值 · ref · getter

与 SortableListOptions 中相同,作用于可见的行:被添加、删除或移动的节点,以及节点展开或折叠时显示或隐藏的行(collapsed)。

boolean值 · ref · getter

树自身的尺寸跟随它的行,与列表一样(animateSize)。默认 true。

boolean | AutoScrollOptions值 · ref · getter

为这棵树的滚动容器覆盖 provider 的 autoScroll。在拖拽开始时读取。

MaybeElementRef

与 SortableListOptions 中相同:替树接收放置的元素,默认是树自己的元素。

boolean值 · ref · getter

true:它的行不能被拖拽,它也不接受任何项。

( event: SortableTreeDropEvent<T>, ) => MaybePromise<BeforeDropResult>

与 SortableListOptions 中相同。

(event: SortableTreeDropEvent<T>) => void

与 SortableListOptions 中相同:在写入之前调用,event.preventDefault() 会跳过写入。

返回值

makeSortableTree 的返回值。

Key

树的 id:id 选项,或为它生成的 id。

ComputedRef<FlatNode<T>[]>

按草稿顺序排列的可见节点;当前节点带有它的预测深度。

ComputedRef<TreeProjection | null>

当前节点将会落到哪里,不在这棵树中时为 null。

ComputedRef<SortableIndicator | null>

指示器模式:放置的位置,以及它的 depth 和 parentKey;不在这里时为 null。

ComputedRef<boolean>

有拖拽位于树上方。

ComputedRef<boolean>

有东西正在被拖拽,并且这棵树接收它。

ComputedRef<Key | null>

虚拟化器必须保持挂载的行:当占位位于这棵树中时,是占位所在的行(被拖拽的节点、抓起的节点所在的那个选中节点、副本、新创建的节点),否则是被拖拽的节点。

ComputedRef<number>

activeKey 在 items 中的索引,不在这里时为 -1。

ComputedRef<Size | null>

拖拽开始时被拖拽行的尺寸。

() => void

为不是本库引起的布局变化添加动画(例如虚拟化器重新测量)。

扁平节点

树中一个可见的节点,与树的 items 列出的一致:按顺序渲染它们,并按 depth 缩进。

Key

节点的 key(getKey)。

T

你的节点。

number

它的深度:根节点为 0。被拖拽的节点使用它的预计深度。

Key | null

父节点的 key;根节点为 null。

number

在兄弟节点中的索引。

boolean

它有子节点,无论是否显示。

boolean

它的子节点被隐藏了(它的 key 在 collapsed 中)。

投影

被拖拽的节点将落到树中的哪里。

number

它将得到的深度(根节点为 0)。

Key | null

它将归入的父节点;在根层级时为 null。

树中的拖拽如何选择深度:'offset',按横向移动的距离(每级 indentation);'hover',悬停在某行的中间,该行会把它作为子节点接收;'both'。

type TreeNesting = 'offset' | 'hover' | 'both'

放置事件

树的放置事件。index 是在 parentKey 之下兄弟节点中的位置(from:移动之前;to:移动之后,此时节点已从原位置移除)。对于根节点以及来自其他列表的项,from.parentKey 为 null。多项拖拽会把 keys(各自带着子树)并排移动:from 是带领这次拖拽的节点(抓起的节点,或它所在的那个选中节点)原来的位置,to 是其中第一个节点落下的位置。复制(mode: 'copy')会把节点留在原处,并插入 items,即它们的副本;普通可拖拽元素(mode: 'insert')则插入 createItem 创建的节点。

{ list: Key | null; index: number; parentKey: Key | null }

带领拖拽的节点原来所在的位置:它所在的树、它在兄弟节点中的索引、它的父节点。

{ list: Key; index: number; parentKey: Key | null }

第一个被放下的节点落到的位置:它所在的树、它在新兄弟节点中的索引、它的新父节点。