Для плоского набора без вложенности подойдёт CdsList, для навигации по разделам — CdsMenu, а для раскрывающихся секций контента — CdsExpandablePanel.
Анатомия
Узел дерева складывается из отступа вложенности, переключателя раскрытия и контента с заголовком. Чекбокс появляется с пропом checkable, иконка узла — с show-icon.
Вариации
Раскрытие узлов
Данные дерева — массив узлов { title, key, children } в пропе tree-data. Состоянием раскрытия управляет v-model:expanded-keys; если контролировать его не нужно, задайте стартовое состояние через default-expanded-keys или default-expand-all.
Проп expand-action раскрывает узел кликом по всей строке: click — по одиночному, dblclick — по двойному. Без него узел раскрывается только переключателем.
Выбор узлов и чекбоксы
Проп selectable включает выбор узла кликом (v-model:selected-keys), multiple разрешает выбрать несколько узлов. Проп checkable добавляет чекбоксы с собственным состоянием v-model:checked-keys: отметка родителя отмечает всех потомков, а частично отмеченный родитель переходит в промежуточное состояние (отключается пропом check-strictly). Отдельные узлы блокируются флагами disabled и disableCheckbox прямо в данных.
Соединительные линии
Проп show-line рисует линии между узлами — в глубоких деревьях так проще следить за уровнями. Объект { showLeafIcon } управляет иконкой листовых узлов.
Иконки и слоты
Слоты кастомизируют каждую часть узла; в них приходит контекст узла — key, title, expanded, selected и другие поля.
| Слот | Описание |
|---|---|
default | Декларативное описание узлов разметкой вместо tree-data |
icon | Иконка узла. Отображается при show-icon |
switcherIcon | Иконка переключателя раскрытия |
title | Содержимое заголовка узла |
Асинхронная загрузка
Проп load-data подгружает дочерние узлы при первом раскрытии: функция получает узел, возвращает промис и дописывает children в данные. Пока промис не разрешён, у узла крутится индикатор загрузки.
Перетаскивание
Проп draggable разрешает перетаскивать узлы; вариант { icon: true } показывает ручку перетаскивания. Дерево не меняет данные само — обработчик @drop перестраивает tree-data, а allow-drop ограничивает допустимые места сброса.
Виртуальная прокрутка
Виртуальный список включён по умолчанию (проп virtual). Задайте height — и дерево прокручивается внутри фиксированной высоты, рендеря только видимые узлы: тысячи строк не тормозят страницу.
Режим директорий
CdsTreeDirectory — дерево с предустановками под файлы и папки: иконки директорий, раскрытие по клику и растянутые на всю ширину узлы. Принимает те же пропсы, что и CdsTree.
Рекомендации
Сценарии использования
Выбор разделов для выгрузки
Чекбоксы собирают набор разделов, счётчик в кнопке подсказывает объём выборки. Свойство loading кнопки показывает ход выгрузки, disabled не даёт запустить её с пустым выбором.
Поиск по дереву
Поле ввода фильтрует tree-data на лету: в дереве остаются совпадения и их родители, а v-model:expanded-keys раскрывает ветки с найденными узлами. Если совпадений нет — показываем пустое состояние вместо дерева.
Файлы проекта
CdsTreeDirectory с v-model:selected-keys работает как проводник: клик по папке раскрывает её, клик по файлу выбирает его. Ключи узлов хранят путь к файлу, поэтому выбранный элемент сразу готов к показу или запросу.
API
CdsTree
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
allowDrop | NTree.TAllowDrop<NTree.IDataNode> | undefined | true | Разрешает сброс на узле |
autoExpandParent | boolean | undefined | false | Автоматически раскрывать родительский узел |
blockNode | boolean | undefined | false | Узел дерева заполняет все оставшееся горизонтальное пространство |
checkable | boolean | undefined | false | Добавляет checkbox перед узлами дерева |
checkedKeys | NTree.TKey[] | { checked: NTree.TKey[]; halfChecked: NTree.TKey[]; } | undefined | — | (v-model) Определяет ключи выбранных узлов дерева. Когда указан ключ узла дерева, который также является родительским узлом дерева, все дочерние узлы дерева будут checked; и наоборот, когда указан ключ узла дерева, который является дочерним узлом дерева, его родительский узел дерева также будет checked. Когда checkable и checkStrictly равны true, объект имеет свойство checked и halfChecked. Независимо от того, проверяется ли дочерний или родительский узел дерева, они не будут влиять друг на друга. |
checkStrictly | boolean | undefined | false | Выбирает только родительский узел. |
defaultExpandAll | boolean | undefined | false | Раскрывать все узлы по умолчанию |
defaultExpandedKeys | NTree.TKey[] | undefined | [] | Раскрывать все узлы по умолчанию |
defaultExpandParent | boolean | undefined | true | Раскрывать родительские узлы по умолчанию |
defaultSelectedKeys | NTree.TKey[] | undefined | — | Выбранные узлы дерева по умолчанию |
disabled | boolean | null | undefined | null | Заблокированное состояние |
draggable | boolean | NTree.TDraggableConfig | undefined | false | Разрешает перетаскивание узлов дерева |
expandAction | NTree.TExpandAction | undefined | — | Действие, которое будет раскрывать/скрывать узлы дерева |
expandedKeys | NTree.TKey[] | undefined | — | (v-model) Определяет ключи раскрытых узлов дерева. |
fieldNames | NTree.IFieldNames | undefined | — | Заменяет поля title, key и children в treeNode на соответствующие поля в treeData |
filterTreeNode | ((treeNode: NTree.IEventDataNode) => boolean) | undefined | — | Функция для фильтрации (выделения) узлов дерева. Когда функция возвращает true, узел дерева будет выделен. |
height | number | undefined | — | Высота виртуального списка для прокрутки |
icon | ((nodeProps: NTree.ITreeNodeAttribute) => any) | undefined | — | Иконка узла дерева (также доступно через slot#icon) |
loadData | ((treeNode: NTree.IEventDataNode) => Promise<any>) | undefined | — | Загружает данные для узла дерева асинхронно |
loadedKeys | NTree.TKey[] | undefined | [] | Загруженные узлы дерева. Необходимо для работы с loadData |
multiple | boolean | undefined | false | Множественный выбор узлов дерева |
openAnimation | Function | undefined | — | Функция анимации открытия/закрытия узла дерева |
selectable | boolean | undefined | false | Выбираемые узлы дерева |
selectedKeys | NTree.TKey[] | undefined | — | (v-model) Определяет ключи выбранных узлов дерева. |
showIcon | boolean | undefined | false | Показывает иконку узла дерева |
showLine | boolean | { showLeafIcon: string | boolean; } | undefined | — | Показывает линии между узлами дерева |
switcherIcon | ((nodeProps: SwitcherIconProps) => any) | undefined | — | Иконка открытия/закрытия узла дерева (также доступно через slot#switcherIcon) |
theme | string | undefined | — | Тема компонента |
treeData | NTree.IDataNode[] | undefined | — | Данные дерева |
virtual | boolean | undefined | true | Включает виртуальную прокрутку списка в дереве, по-умолчанию включено |
События
| Имя | Тип | Описание |
|---|---|---|
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). |
Слоты
| Имя | Тип | Описание |
|---|---|---|
default | any | Узлы дерева по умолчанию (при декларативном описании через разметку). |
icon | NTree.ITreeNodeAttribute | Кастомная иконка узла дерева. |
switcherIcon | any | Кастомная иконка раскрытия/скрытия узла (переключатель). |
title | NTree.IEventDataNode | Кастомный заголовок узла дерева. |
Exposed
| Имя | Тип | Описание |
|---|---|---|
halfCheckedKeys | any | Ключи узлов с частично отмеченными потомками — состояние «наполовину выбран». |
loadingKeys | any | Ключи узлов, для которых сейчас идёт ленивая подгрузка потомков. |
scrollTo | ScrollTo | Прокручивает дерево к узлу по ключу или к указанной позиции. |
treeRef | any | Ссылка на внутренний экземпляр дерева. |
CdsTreeDirectory
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
allowDrop | NTree.TAllowDrop<NTree.IDataNode> | undefined | true | Разрешает сброс на узле |
autoExpandParent | boolean | undefined | false | Автоматически раскрывать родительский узел |
blockNode | boolean | undefined | false | Узел дерева заполняет все оставшееся горизонтальное пространство |
checkable | boolean | undefined | false | Добавляет checkbox перед узлами дерева |
checkedKeys | NTree.TKey[] | { checked: NTree.TKey[]; halfChecked: NTree.TKey[]; } | undefined | — | (v-model) Определяет ключи выбранных узлов дерева. Когда указан ключ узла дерева, который также является родительским узлом дерева, все дочерние узлы дерева будут checked; и наоборот, когда указан ключ узла дерева, который является дочерним узлом дерева, его родительский узел дерева также будет checked. Когда checkable и checkStrictly равны true, объект имеет свойство checked и halfChecked. Независимо от того, проверяется ли дочерний или родительский узел дерева, они не будут влиять друг на друга. |
checkStrictly | boolean | undefined | false | Выбирает только родительский узел. |
defaultExpandAll | boolean | undefined | false | Раскрывать все узлы по умолчанию |
defaultExpandedKeys | NTree.TKey[] | undefined | [] | Раскрывать все узлы по умолчанию |
defaultExpandParent | boolean | undefined | true | Раскрывать родительские узлы по умолчанию |
defaultSelectedKeys | NTree.TKey[] | undefined | — | Выбранные узлы дерева по умолчанию |
draggable | boolean | NTree.TDraggableConfig | undefined | false | Разрешает перетаскивание узлов дерева |
expandAction | string | false | undefined | — | Действие, которое будет раскрывать/скрывать узлы дерева |
expandedKeys | NTree.TKey[] | undefined | — | (v-model) Определяет ключи раскрытых узлов дерева. |
fieldNames | NTree.IFieldNames | undefined | — | Заменяет поля title, key и children в treeNode на соответствующие поля в treeData |
filterTreeNode | ((treeNode: NTree.IEventDataNode) => boolean) | undefined | — | Функция для фильтрации (выделения) узлов дерева. Когда функция возвращает true, узел дерева будет выделен. |
height | number | undefined | — | Высота виртуального списка для прокрутки |
icon | ((nodeProps: NTree.ITreeNodeAttribute) => any) | undefined | — | Иконка узла дерева (также доступно через slot#icon) |
loadData | ((treeNode: NTree.IEventDataNode) => Promise<any>) | undefined | — | Загружает данные для узла дерева асинхронно |
loadedKeys | NTree.TKey[] | undefined | [] | Загруженные узлы дерева. Необходимо для работы с loadData |
multiple | boolean | undefined | false | Множественный выбор узлов дерева |
openAnimation | Function | undefined | — | Функция анимации открытия/закрытия узла дерева |
selectable | boolean | undefined | false | Выбираемые узлы дерева |
selectedKeys | NTree.TKey[] | undefined | — | (v-model) Определяет ключи выбранных узлов дерева. |
showIcon | boolean | undefined | false | Показывает иконку узла дерева |
showLine | boolean | { showLeafIcon: string | boolean; } | undefined | — | Показывает линии между узлами дерева |
switcherIcon | ((nodeProps: SwitcherIconProps) => any) | undefined | — | Иконка открытия/закрытия узла дерева (также доступно через slot#switcherIcon) |
treeData | NTree.IDataNode[] | undefined | — | Данные дерева |
virtual | boolean | undefined | true | Включает виртуальную прокрутку списка в дереве, по-умолчанию включено |
События
| Имя | Тип | Описание |
|---|---|---|
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
Пропсы
| Имя | Тип | По умолчанию | Описание |
|---|---|---|---|
active | boolean | undefined | — | Подсвечивает узел как активный |
checkable | boolean | undefined | — | Показывает чекбокс у узла |
data | NTree.IDataNode | undefined | undefined as unknown as NTree.IDataNode | Данные узла — исходный элемент списка, из которого построен узел |
disableCheckbox | boolean | undefined | — | Блокирует только чекбокс узла, оставляя сам узел доступным |
disabled | boolean | undefined | — | Блокирует узел: нельзя выделить, отметить или раскрыть |
domRef | ((arg: any) => void) | undefined | — | Колбэк, получающий DOM-элемент узла после монтирования |
eventKey | NTree.TKey | undefined | '' | Уникальный ключ узла — по нему дерево отслеживает выбор, раскрытие и отметку |
icon | Function | undefined | — | Функция, возвращающая иконку узла |
isEnd | boolean[] | undefined | — | Признаки «последний на своём уровне» для каждого уровня вложенности — по ним рисуются соединительные линии |
isLeaf | boolean | undefined | — | Узел — лист: не имеет потомков и не показывает переключатель раскрытия |
isStart | boolean[] | undefined | — | Признаки «первый на своём уровне» для каждого уровня вложенности — по ним рисуются соединительные линии |
parent | NTree.IDataNode | undefined | undefined as unknown as NTree.IDataNode | Данные родительского узла. Для узлов верхнего уровня не задаётся |
prefixCls | string | undefined | — | Префикс CSS-классов узла |
selectable | boolean | undefined | — | Разрешает выделять узел |
switcherIcon | Function | undefined | — | Функция, возвращающая иконку переключателя раскрытия узла |
title | string | (Function & string) | undefined | — | Заголовок узла дерева: строка или рендер-функция |