Skip to content

CdsTree

Дерево показывает иерархию: разделы каталога, файлы проекта, структуру организации. Узлы раскрываются, выбираются кликом или чекбоксами, подгружаются с сервера и перетаскиваются, а виртуальная прокрутка держит плавной работу даже с тысячами узлов.

Storybook GitLab Figma
Покрытие тестами: 82% — частичное покрытие
API в спеках
116 / 116 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
152 юнит · 8 браузерных · 1 в планах
Известные баги
23 зафиксированы тестом it.fails
Покрытие кода
81.5% строк · 71.8% ветвей замер v4.0.0-alpha.13
A11y (axe)
38 рекомендаций в 14 историях замер v4.0.0-alpha.11

Для плоского набора без вложенности подойдёт CdsList, для навигации по разделам — CdsMenu, а для раскрывающихся секций контента — CdsExpandablePanel.

Анатомия ​

Узел дерева складывается из отступа вложенности, переключателя раскрытия и контента с заголовком. Чекбокс появляется с пропом checkable, иконка узла — с show-icon.

Вариации ​

Раскрытие узлов ​

Данные дерева — массив узлов { title, key, children } в пропе tree-data. Состоянием раскрытия управляет v-model:expanded-keys; если контролировать его не нужно, задайте стартовое состояние через default-expanded-keys или default-expand-all.

Sandbox Storybook

Проп expand-action раскрывает узел кликом по всей строке: click — по одиночному, dblclick — по двойному. Без него узел раскрывается только переключателем.

Sandbox Storybook

Выбор узлов и чекбоксы ​

Проп selectable включает выбор узла кликом (v-model:selected-keys), multiple разрешает выбрать несколько узлов. Проп checkable добавляет чекбоксы с собственным состоянием v-model:checked-keys: отметка родителя отмечает всех потомков, а частично отмеченный родитель переходит в промежуточное состояние (отключается пропом check-strictly). Отдельные узлы блокируются флагами disabled и disableCheckbox прямо в данных.

Sandbox Storybook

Соединительные линии ​

Проп show-line рисует линии между узлами — в глубоких деревьях так проще следить за уровнями. Объект { showLeafIcon } управляет иконкой листовых узлов.

Sandbox Storybook

Иконки и слоты ​

Слоты кастомизируют каждую часть узла; в них приходит контекст узла — key, title, expanded, selected и другие поля.

СлотОписание
defaultДекларативное описание узлов разметкой вместо tree-data
iconИконка узла. Отображается при show-icon
switcherIconИконка переключателя раскрытия
titleСодержимое заголовка узла
Sandbox Storybook

Асинхронная загрузка ​

Проп load-data подгружает дочерние узлы при первом раскрытии: функция получает узел, возвращает промис и дописывает children в данные. Пока промис не разрешён, у узла крутится индикатор загрузки.

Sandbox Storybook

Перетаскивание ​

Проп draggable разрешает перетаскивать узлы; вариант { icon: true } показывает ручку перетаскивания. Дерево не меняет данные само — обработчик @drop перестраивает tree-data, а allow-drop ограничивает допустимые места сброса.

Sandbox Storybook

Виртуальная прокрутка ​

Виртуальный список включён по умолчанию (проп virtual). Задайте height — и дерево прокручивается внутри фиксированной высоты, рендеря только видимые узлы: тысячи строк не тормозят страницу.

Sandbox Storybook

Режим директорий ​

CdsTreeDirectory — дерево с предустановками под файлы и папки: иконки директорий, раскрытие по клику и растянутые на всю ширину узлы. Принимает те же пропсы, что и CdsTree.

Sandbox Storybook

Рекомендации ​

Сценарии использования ​

Выбор разделов для выгрузки ​

Чекбоксы собирают набор разделов, счётчик в кнопке подсказывает объём выборки. Свойство loading кнопки показывает ход выгрузки, disabled не даёт запустить её с пустым выбором.

Sandbox Storybook

Поиск по дереву ​

Поле ввода фильтрует tree-data на лету: в дереве остаются совпадения и их родители, а v-model:expanded-keys раскрывает ветки с найденными узлами. Если совпадений нет — показываем пустое состояние вместо дерева.

Sandbox Storybook

Файлы проекта ​

CdsTreeDirectory с v-model:selected-keys работает как проводник: клик по папке раскрывает её, клик по файлу выбирает его. Ключи узлов хранят путь к файлу, поэтому выбранный элемент сразу готов к показу или запросу.

Sandbox Storybook

API ​

CdsTree ​

Пропсы

ИмяТипПо умолчаниюОписание
allowDropNTree.TAllowDrop<NTree.IDataNode> | undefinedtrueРазрешает сброс на узле
autoExpandParentboolean | undefinedfalseАвтоматически раскрывать родительский узел
blockNodeboolean | undefinedfalseУзел дерева заполняет все оставшееся горизонтальное пространство
checkableboolean | undefinedfalseДобавляет checkbox перед узлами дерева
checkedKeysNTree.TKey[] | { checked: NTree.TKey[]; halfChecked: NTree.TKey[]; } | undefined—(v-model) Определяет ключи выбранных узлов дерева. Когда указан ключ узла дерева, который также является родительским узлом дерева, все дочерние узлы дерева будут checked; и наоборот, когда указан ключ узла дерева, который является дочерним узлом дерева, его родительский узел дерева также будет checked. Когда checkable и checkStrictly равны true, объект имеет свойство checked и halfChecked. Независимо от того, проверяется ли дочерний или родительский узел дерева, они не будут влиять друг на друга.
checkStrictlyboolean | undefinedfalseВыбирает только родительский узел.
defaultExpandAllboolean | undefinedfalseРаскрывать все узлы по умолчанию
defaultExpandedKeysNTree.TKey[] | undefined[]Раскрывать все узлы по умолчанию
defaultExpandParentboolean | undefinedtrueРаскрывать родительские узлы по умолчанию
defaultSelectedKeysNTree.TKey[] | undefined—Выбранные узлы дерева по умолчанию
disabledboolean | null | undefinednullЗаблокированное состояние
draggableboolean | NTree.TDraggableConfig | undefinedfalseРазрешает перетаскивание узлов дерева
expandActionNTree.TExpandAction | undefined—Действие, которое будет раскрывать/скрывать узлы дерева
expandedKeysNTree.TKey[] | undefined—(v-model) Определяет ключи раскрытых узлов дерева.
fieldNamesNTree.IFieldNames | undefined—Заменяет поля title, key и children в treeNode на соответствующие поля в treeData
filterTreeNode((treeNode: NTree.IEventDataNode) => boolean) | undefined—Функция для фильтрации (выделения) узлов дерева. Когда функция возвращает true, узел дерева будет выделен.
heightnumber | undefined—Высота виртуального списка для прокрутки
icon((nodeProps: NTree.ITreeNodeAttribute) => any) | undefined—Иконка узла дерева (также доступно через slot#icon)
loadData((treeNode: NTree.IEventDataNode) => Promise<any>) | undefined—Загружает данные для узла дерева асинхронно
loadedKeysNTree.TKey[] | undefined[]Загруженные узлы дерева. Необходимо для работы с loadData
multipleboolean | undefinedfalseМножественный выбор узлов дерева
openAnimationFunction | undefined—Функция анимации открытия/закрытия узла дерева
selectableboolean | undefinedfalseВыбираемые узлы дерева
selectedKeysNTree.TKey[] | undefined—(v-model) Определяет ключи выбранных узлов дерева.
showIconboolean | undefinedfalseПоказывает иконку узла дерева
showLineboolean | { showLeafIcon: string | boolean; } | undefined—Показывает линии между узлами дерева
switcherIcon((nodeProps: SwitcherIconProps) => any) | undefined—Иконка открытия/закрытия узла дерева (также доступно через slot#switcherIcon)
themestring | undefined—Тема компонента
treeDataNTree.IDataNode[] | undefined—Данные дерева
virtualboolean | undefinedtrueВключает виртуальную прокрутку списка в дереве, по-умолчанию включено

События

ИмяТипОписание
check[checked: NTree.TKey[] | { checked: NTree.TKey[]; halfChecked: NTree.TKey[]; }, info: NTree.ICheckInfo]Событие выбора узла по чекбоксу.
click[event: MouseEvent, node: NTree.IEventDataNode]Событие клика по узлу.
dblclick[event: MouseEvent, node: NTree.IEventDataNode]Событие двойного клика по узлу.
doubleclick[event: MouseEvent, node: NTree.IEventDataNode]Событие двойного клика по узлу (алиас).
dragend[info: NTree.TNodeDragEventParams]Событие окончания перетаскивания узла.
dragenter[info: NTree.TNodeDragEventParams & { expandedKeys: NTree.TKey[]; }]Событие входа узла в зону перетаскивания.
dragleave[info: NTree.TNodeDragEventParams]Событие выхода узла из зоны перетаскивания.
dragover[info: NTree.TNodeDragEventParams]Событие перемещения узла в зоне перетаскивания.
dragstart[info: NTree.TNodeDragEventParams]Событие начала перетаскивания узла.
drop[info: NTree.TNodeDragEventParams & { dragNode: NTree.IEventDataNode; dragNodesKeys: NTree.TKey[]; dropPosition: number; dropToGap: boolean; }]Событие перемещения узла (drop).
expand[expandedKeys: NTree.TKey[], info: { node: NTree.IEventDataNode; expanded: boolean; nativeEvent: MouseEvent; }]Событие раскрытия узла.
load[loadedKeys: NTree.TKey[], info: { event: "load"; node: NTree.IEventDataNode; }]Событие загрузки узла (async loadData).
rightClick[info: { event: MouseEvent; node: NTree.IEventDataNode; }]Событие правого клика по узлу.
select[selectedKeys: NTree.TKey[], info: { event: "select"; selected: boolean; node: NTree.IEventDataNode; selectedNodes: NTree.IDataNode[]; nativeEvent: MouseEvent; }]Событие выбора узла.
update:checkedKeys[checkedKeys: NTree.TKey[] | { checked: NTree.TKey[]; halfChecked: NTree.TKey[]; }]Событие выбора узла по чекбоксу (v-model).
update:expandedKeys[expandedKeys: NTree.TKey[]]Событие раскрытия узла (v-model).
update:selectedKeys[selectedKeys: NTree.TKey[]]Событие выбора узла (v-model).

Слоты

ИмяТипОписание
defaultanyУзлы дерева по умолчанию (при декларативном описании через разметку).
iconNTree.ITreeNodeAttributeКастомная иконка узла дерева.
switcherIconanyКастомная иконка раскрытия/скрытия узла (переключатель).
titleNTree.IEventDataNodeКастомный заголовок узла дерева.

Exposed

ИмяТипОписание
halfCheckedKeysanyКлючи узлов с частично отмеченными потомками — состояние «наполовину выбран».
loadingKeysanyКлючи узлов, для которых сейчас идёт ленивая подгрузка потомков.
scrollToScrollToПрокручивает дерево к узлу по ключу или к указанной позиции.
treeRefanyСсылка на внутренний экземпляр дерева.

CdsTreeDirectory ​

Пропсы

ИмяТипПо умолчаниюОписание
allowDropNTree.TAllowDrop<NTree.IDataNode> | undefinedtrueРазрешает сброс на узле
autoExpandParentboolean | undefinedfalseАвтоматически раскрывать родительский узел
blockNodeboolean | undefinedfalseУзел дерева заполняет все оставшееся горизонтальное пространство
checkableboolean | undefinedfalseДобавляет checkbox перед узлами дерева
checkedKeysNTree.TKey[] | { checked: NTree.TKey[]; halfChecked: NTree.TKey[]; } | undefined—(v-model) Определяет ключи выбранных узлов дерева. Когда указан ключ узла дерева, который также является родительским узлом дерева, все дочерние узлы дерева будут checked; и наоборот, когда указан ключ узла дерева, который является дочерним узлом дерева, его родительский узел дерева также будет checked. Когда checkable и checkStrictly равны true, объект имеет свойство checked и halfChecked. Независимо от того, проверяется ли дочерний или родительский узел дерева, они не будут влиять друг на друга.
checkStrictlyboolean | undefinedfalseВыбирает только родительский узел.
defaultExpandAllboolean | undefinedfalseРаскрывать все узлы по умолчанию
defaultExpandedKeysNTree.TKey[] | undefined[]Раскрывать все узлы по умолчанию
defaultExpandParentboolean | undefinedtrueРаскрывать родительские узлы по умолчанию
defaultSelectedKeysNTree.TKey[] | undefined—Выбранные узлы дерева по умолчанию
draggableboolean | NTree.TDraggableConfig | undefinedfalseРазрешает перетаскивание узлов дерева
expandActionstring | false | undefined—Действие, которое будет раскрывать/скрывать узлы дерева
expandedKeysNTree.TKey[] | undefined—(v-model) Определяет ключи раскрытых узлов дерева.
fieldNamesNTree.IFieldNames | undefined—Заменяет поля title, key и children в treeNode на соответствующие поля в treeData
filterTreeNode((treeNode: NTree.IEventDataNode) => boolean) | undefined—Функция для фильтрации (выделения) узлов дерева. Когда функция возвращает true, узел дерева будет выделен.
heightnumber | undefined—Высота виртуального списка для прокрутки
icon((nodeProps: NTree.ITreeNodeAttribute) => any) | undefined—Иконка узла дерева (также доступно через slot#icon)
loadData((treeNode: NTree.IEventDataNode) => Promise<any>) | undefined—Загружает данные для узла дерева асинхронно
loadedKeysNTree.TKey[] | undefined[]Загруженные узлы дерева. Необходимо для работы с loadData
multipleboolean | undefinedfalseМножественный выбор узлов дерева
openAnimationFunction | undefined—Функция анимации открытия/закрытия узла дерева
selectableboolean | undefinedfalseВыбираемые узлы дерева
selectedKeysNTree.TKey[] | undefined—(v-model) Определяет ключи выбранных узлов дерева.
showIconboolean | undefinedfalseПоказывает иконку узла дерева
showLineboolean | { showLeafIcon: string | boolean; } | undefined—Показывает линии между узлами дерева
switcherIcon((nodeProps: SwitcherIconProps) => any) | undefined—Иконка открытия/закрытия узла дерева (также доступно через slot#switcherIcon)
treeDataNTree.IDataNode[] | undefined—Данные дерева
virtualboolean | undefinedtrueВключает виртуальную прокрутку списка в дереве, по-умолчанию включено

События

ИмяТипОписание
check[checked: NTree.TKey[] | { checked: NTree.TKey[]; halfChecked: NTree.TKey[]; }, info: NTree.ICheckInfo]Событие выбора узла по чекбоксу.
click[event: MouseEvent, node: NTree.IEventDataNode]Событие клика по узлу.
dblclick[event: MouseEvent, node: NTree.IEventDataNode]Событие двойного клика по узлу.
doubleclick[event: MouseEvent, node: NTree.IEventDataNode]Событие двойного клика по узлу (алиас).
dragend[info: NTree.TNodeDragEventParams]Событие окончания перетаскивания узла.
dragenter[info: NTree.TNodeDragEventParams & { expandedKeys: NTree.TKey[]; }]Событие входа узла в зону перетаскивания.
dragleave[info: NTree.TNodeDragEventParams]Событие выхода узла из зоны перетаскивания.
dragover[info: NTree.TNodeDragEventParams]Событие перемещения узла в зоне перетаскивания.
dragstart[info: NTree.TNodeDragEventParams]Событие начала перетаскивания узла.
drop[info: NTree.TNodeDragEventParams & { dragNode: NTree.IEventDataNode; dragNodesKeys: NTree.TKey[]; dragPosition: number; dropToGap: boolean; }]Событие перемещения узла (drop).
expand[expandedKeys: NTree.TKey[], info: { node: NTree.IEventDataNode; expanded: boolean; nativeEvent: MouseEvent; }]Событие раскрытия узла.
load[treeNode: NTree.IEventDataNode]Событие загрузки узла (async loadData).
rightClick[info: { event: MouseEvent; node: NTree.IEventDataNode; }]Событие правого клика по узлу.
select[selectedKeys: NTree.TKey[], info: { event: "select"; selected: boolean; node: NTree.IEventDataNode; selectedNodes: NTree.IDataNode[]; nativeEvent: MouseEvent; }]Событие выбора узла.
update:checkedKeys[checkedKeys: NTree.TKey[] | { checked: NTree.TKey[]; halfChecked: NTree.TKey[]; }]Событие выбора узла по чекбоксу (v-model).
update:expandedKeys[expandedKeys: NTree.TKey[]]Событие раскрытия узла (v-model).
update:selectedKeys[selectedKeys: NTree.TKey[]]Событие выбора узла (v-model).

CdsTreeNode ​

Пропсы

ИмяТипПо умолчаниюОписание
activeboolean | undefined—Подсвечивает узел как активный
checkableboolean | undefined—Показывает чекбокс у узла
dataNTree.IDataNode | undefinedundefined as unknown as NTree.IDataNodeДанные узла — исходный элемент списка, из которого построен узел
disableCheckboxboolean | undefined—Блокирует только чекбокс узла, оставляя сам узел доступным
disabledboolean | undefined—Блокирует узел: нельзя выделить, отметить или раскрыть
domRef((arg: any) => void) | undefined—Колбэк, получающий DOM-элемент узла после монтирования
eventKeyNTree.TKey | undefined''Уникальный ключ узла — по нему дерево отслеживает выбор, раскрытие и отметку
iconFunction | undefined—Функция, возвращающая иконку узла
isEndboolean[] | undefined—Признаки «последний на своём уровне» для каждого уровня вложенности — по ним рисуются соединительные линии
isLeafboolean | undefined—Узел — лист: не имеет потомков и не показывает переключатель раскрытия
isStartboolean[] | undefined—Признаки «первый на своём уровне» для каждого уровня вложенности — по ним рисуются соединительные линии
parentNTree.IDataNode | undefinedundefined as unknown as NTree.IDataNodeДанные родительского узла. Для узлов верхнего уровня не задаётся
prefixClsstring | undefined—Префикс CSS-классов узла
selectableboolean | undefined—Разрешает выделять узел
switcherIconFunction | undefined—Функция, возвращающая иконку переключателя раскрытия узла
titlestring | (Function & string) | undefined—Заголовок узла дерева: строка или рендер-функция