Компонент Tree в Naive UI представляет собой мощный инструмент для визуализации и управления иерархическими структурами данных. Он поддерживает различные режимы отображения, динамическую подгрузку узлов, чекбоксы для выбора нескольких элементов, а также множество событий для взаимодействия с пользователем.
Для использования компонента необходимо импортировать его из библиотеки:
import { NTree } from 'naive-ui'
Базовая структура данных для Tree должна быть в виде массива объектов
с полями label и key. Пример:
const treeData = [
{
label: 'Папка 1',
key: '1',
children: [
{ label: 'Файл 1-1', key: '1-1' },
{ label: 'Файл 1-2', key: '1-2' }
]
},
{
label: 'Папка 2',
key: '2'
}
]
Использование компонента с минимальной конфигурацией:
<NTree :data="treeData" />
Каждый узел дерева может содержать дополнительные свойства:
disabled — отключение узла.checkable — возможность отображения чекбокса.expandable — возможность разворачивания/сворачивания
узла.children — массив дочерних узлов.Пример узла с чекбоксом и отключением:
const treeData = [
{
label: 'Папка 1',
key: '1',
checkable: true,
disabled: true,
children: [
{ label: 'Файл 1-1', key: '1-1', checkable: true }
]
}
]
Tree поддерживает несколько режимов выбора:
checkable: true на узлах.Для отслеживания состояния выбора используется свойство
value (или checkedKeys для чекбоксов):
<NTree
:data="treeData"
:checked-keys="['1-1']"
checkable
/>
Tree может поддерживать ленивую загрузку данных для больших деревьев.
Для этого используется функция load:
const loadNode = async (node) => {
// имитация асинхронного запроса
return [
{ label: `Подузел ${node.key}-1`, key: `${node.key}-1` },
{ label: `Подузел ${node.key}-2`, key: `${node.key}-2` }
]
}
<NTree :load="loadNode" :data="treeData" />
Такой подход позволяет загружать дочерние узлы только при раскрытии родительского, что существенно снижает нагрузку на фронтенд при работе с большими структурами.
Tree поддерживает слоты для кастомизации отображения узлов:
<NTree :data="treeData" v-slot="{ node, level }">
<div :style="{ paddingLeft: `${level * 20}px` }">
<strong>{{ node.label }}</strong>
</div>
</NTree>
Это позволяет полностью контролировать визуальное оформление каждого узла, включая использование иконок, цветов, кнопок и других элементов.
Компонент Tree предоставляет множество событий:
on-update:value — вызывается при изменении выбранного
узла.on-expand — срабатывает при раскрытии узла.on-check — вызывается при изменении состояния
чекбокса.on-select — при клике на узел.Методы для работы с деревом:
getNode(key) — получение узла по ключу.getCheckedKeys() — получение массива выбранных
ключей.setCheckedKeys(keys) — программное обновление состояния
выбора.expandNode(key) — программное раскрытие узла.Пример использования события on-check:
<NTree
:data="treeData"
checkable
@on-check="handleCheck"
/>
<script>
const handleCheck = (checkedKeys, info) => {
console.log('Выбранные узлы:', checkedKeys)
console.log('Подробная информация:', info)
}
</script>
Tree наследует возможности стилизации Naive UI через темы и CSS-переменные. Основные переменные:
--tree-item-height — высота строки.--tree-item-padding — отступ узла.--tree-item-color — цвет текста.--tree-item-bg-color — фоновый цвет узла.Пример переопределения стиля:
<NTree :data="treeData" style="--tree-item-height: 40px; --tree-item-color: #1f2937;" />
Также можно использовать классы и scoped CSS для более детальной кастомизации отдельных узлов.
Для больших деревьев рекомендуется:
load)
вместо полного рендеринга всех узлов.key) уникальные для каждого узла
для корректного рендеринга и обновления.Компонент Tree в Naive UI сочетает гибкость, производительность и легкость интеграции, позволяя создавать сложные иерархические структуры с полным контролем над выбором, визуализацией и взаимодействием.