Документация/API
makeSortableTree
Делает контейнер сортируемым деревом, отрисованным плоско с глубинами, — вложение сдвигом вбок или наведением на узел.
Страница переведена ИИ и может содержать неточности. Читать английский оригинал
function makeSortableTree<T>( target: MaybeElementRef, options: SortableTreeOptions<T>,): SortableTreeReturn<T>;Делает контейнер сортируемым деревом. Рендерите возвращённый items (видимые узлы в порядке черновика, с отступом по depth) компонентом строки, который вызывает makeSortableItem. При броске, после onDrop, перемещённые узлы (со своими поддеревьями) записываются в options.items, если только event.preventDefault() не оставляет event.result вам.
const root = useTemplateRef<HTMLElement>('root');
const { items } = makeSortableTree(root, { items: files, indentation: 20, collapsed });
Каждая строка вызывает makeSortableItem с id: () => node.key.
См. деревья.
Загружаем демо…
<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 или геттер (overlay, overOverlay, animation, dropAnimation, overDropAnimation — значение или ref) и читаются, когда они нужны дереву, поэтому изменение вступает в силу не позже следующего драга. Исключения: id и group читаются один раз, при создании дерева; items — это сама модель; функции (getKey, getChildren, setChildren, canNest, clone, createItem, колбэки) передаются как есть.
SortableItems<T>Корневые узлы. Записываемый ref: при броске библиотека даёт изменённым узлам новых потомков (setChildren) и записывает новый массив корней. Источник только для чтения (геттер, readonly ref, computed): вызовите event.preventDefault() и примените event.result сами (как в SortableListOptions.items).
(node: T) => KeyПо умолчанию — node.id. Также задаёт ключи для makeSortableItem({ item }), копий и созданных узлов.
(node: T) => T[]Потомки узла. По умолчанию — node.children.
(node: T, children: T[]) => voidКак запись по умолчанию даёт узлу новых потомков. По умолчанию — node.children = children.
(node: T, children: T[]) => TКопия node с children для event.result: новое дерево, которое оставляет ваши узлы как есть (запись по умолчанию всё равно идёт через setChildren). По умолчанию — { ...node }, которому потомки переданы через setChildren ({ ...node, children }, если setChildren нет). Передавайте её для экземпляров классов и узлов, которым мало поверхностной копии.
KeyПо умолчанию — useId(), совпадает при рендере на сервере и на клиенте. Читается один раз.
stringзначение · ref · геттерНазвание дерева для людей: тексты для скринридеров называют его вместо id.
unknownзначение · ref · геттерЛюбые сведения о дереве как о цели: события передают их как over.data, пока над ним драг.
ActivationOptionsзначение · ref · геттерКак нажатие на строки этого дерева начинает драг, вместо activation провайдера (собственная опция строки важнее).
Componentзначение · refКомпонент оверлея для строк этого дерева (собственный overlay строки важнее). Ref, переключённый посреди драга, сразу его меняет.
Componentзначение · refЧто показывает оверлей, пока над этим деревом драг, который оно принимает (см. SortableListOptions.overOverlay). Его проп to говорит, куда вложился бы бросок.
DropAnimationзначение · refКак приземляется оверлей, когда заканчивается драг строк этого дерева (см. SortableListOptions.dropAnimation).
DropAnimationзначение · refКак приземляется оверлей, когда его бросают в это дерево (см. SortableListOptions.overDropAnimation).
Modifier[]значение · ref · геттерМодификаторы для драгов строк этого дерева; применяются после modifiers провайдера (собственные modifiers строки важнее). Например, [restrictToVerticalAxis]. Читается в начале драга. С зафиксированной осью вложение всё равно работает: глубина тогда задаётся наведением на середину строки.
'x' | 'y'значение · ref · геттерФиксирует драги строк этого дерева по одной оси (собственный axis строки важнее), после модификаторов. С 'y' строки всё равно вкладываются: глубина тогда задаётся наведением на середину строки. Читается в начале драга.
string | SortableGroupOptions<T>Списки и деревья с одинаковым именем группы обмениваются элементами. По умолчанию — своя отдельная группа. Читается один раз.
AcceptModeзначение · ref · геттерМульти-драг элементов нескольких типов: принять (group.put) нужно все элементы ('all', по умолчанию) или некоторые ('some').
numberзначение · ref · геттерГоризонтальное смещение в пикселях на один уровень глубины. По умолчанию 24.
TreeNestingзначение · ref · геттерКак выбирается глубина: горизонтальным смещением, наведением на середину строки или и тем и другим (по умолчанию).
SortablePlaceholderзначение · ref · геттер'item' (по умолчанию): перетаскиваемый узел движется между строками на своей расчётной глубине. 'indicator': дерево не двигается; indicator (у дерева и у makeSortableItem каждой строки) показывает, куда пойдёт бросок, с его depth и parentKey, а линию рисуете вы. Бросок снаружи тогда отменяет драг.
numberзначение · ref · геттерМаксимально допустимая глубина (у корней 0). Собственные потомки перетаскиваемых узлов учитываются.
(node: T, parent: T) => booleanМожно ли поместить node под parent; при мульти-драге вызывается для каждого перетаскиваемого узла.
ReadonlySet<Key>значение · ref · геттерКлючи узлов, чьи потомки скрыты.
(node: T) => TСоздаёт копии (group.pull: 'clone', клавиша-модификатор копирования). Обязательна для копирования. Возвращайте копию со всем поддеревом: скопированная папка сохраняет своих потомков. Копии и каждому её потомку нужны собственные ключи (читаются через getKey), как и любому узлу дерева.
(active: Active) => TПринимает обычные перетаскиваемые элементы извне: создаёт узел для вставки в расчётную позицию и на расчётную глубину (к нему применяются canNest и maxDepth). С клавиатуры стрелка в сторону дерева забирает перетаскиваемый элемент на уровень строки, перед которой он встаёт, и дальше стрелки двигают узел, как любой другой. Для драга извне страницы (external) её спрашивают дважды — пока драг удерживают и при броске (см. createItem списка); узел-папка с потомком на каждый файл вмещает несколько файлов.
ExternalAcceptзначение · ref · геттерПринимает драги извне страницы: файлы, ссылки, текст (см. ExternalAccept), с createItem. Узлы его группы, перетащенные из другого окна приложения, попадают в дерево как есть. Значение, ref или геттер, читается вживую.
DropOutsideзначение · ref · геттерБросок вне всех целей: оставить узлы там, где плейсхолдер, отменить или удалить их. По умолчанию 'placeholder' ('cancel' при placeholder: 'indicator'). Читается при броске.
LayoutAnimationзначение · refFLIP-анимация этого дерева; по умолчанию — animation провайдера. Значение или ref (функция — это своя анимация).
AutoAnimationзначение · ref · геттерКак в SortableListOptions, для видимых строк: добавленные, удалённые или перемещённые узлы, а также строки, которые узел показывает или скрывает, когда раскрывается или сворачивается (collapsed).
booleanзначение · ref · геттерСобственный размер дерева следует за его строками, как у списка (animateSize). По умолчанию true.
boolean | AutoScrollOptionsзначение · ref · геттерПереопределяет autoScroll провайдера для скролл-контейнера этого дерева. Читается в начале драга.
MaybeElementRefКак в SortableListOptions: элемент, который принимает броски для дерева; по умолчанию — собственный элемент дерева.
booleanзначение · ref · геттерtrue: его строки нельзя перетащить, и оно не принимает элементы.
( event: SortableTreeDropEvent<T>, ) => MaybePromise<BeforeDropResult>Как в SortableListOptions.
(event: SortableTreeDropEvent<T>) => voidКак в SortableListOptions: до записи, которую пропускает event.preventDefault().
Возвращает
Что возвращает makeSortableTree.
KeyId дерева: опция 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Ключ узла (getKey).
TВаш узел.
numberЕго глубина: у корней 0. У перетаскиваемого узла — его расчётная глубина.
Key | nullКлюч его родителя; null для корня.
numberИндекс среди соседних узлов.
booleanУ него есть потомки, показанные или нет.
booleanЕго потомки скрыты (его ключ есть в collapsed).
Проекция
Куда приземлился бы перетаскиваемый узел в дереве.
Как драг в дереве выбирает глубину: '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 }Куда приземляется первый брошенный узел: его дерево, его индекс среди новых соседних узлов, его новый родитель.