TreeSelect — компонент библиотеки Naive UI, предназначенный для выбора элементов из иерархической структуры данных. Он объединяет функциональность выпадающего списка и древовидного представления. Такой интерфейс используется в ситуациях, когда элементы имеют родительско-дочерние связи и требуется наглядное отображение вложенности.
Типичные сценарии применения:
Компонент интегрирован в экосистему Vue.js и полностью поддерживает реактивную модель данных.
Компонент n-tree-select используется аналогично обычному
Select, но принимает древовидную структуру
данных.
<template>
<n-tree-select
v-model:value="value"
:options="options"
placeholder="Выберите элемент"
/>
</template>
<script setup>
import { ref } from 'vue'
const value = ref(null)
const options = [
{
label: 'Frontend',
key: 'frontend',
children: [
{ label: 'Vue', key: 'vue' },
{ label: 'React', key: 'react' }
]
},
{
label: 'Backend',
key: 'backend',
children: [
{ label: 'Node.js', key: 'node' },
{ label: 'Python', key: 'python' }
]
}
]
</script>
Каждый узел дерева содержит:
| Поле | Назначение |
|---|---|
label |
отображаемое название |
key |
уникальный идентификатор |
children |
массив дочерних элементов |
Тип данных, используемый компонентом, называется TreeOption.
interface TreeOption {
label?: string
key: string | number
children?: TreeOption[]
disabled?: boolean
}
Дополнительные свойства:
| Свойство | Описание |
|---|---|
disabled |
запрещает выбор элемента |
isLeaf |
указывает, что элемент является листом |
prefix |
пользовательский контент перед текстом |
suffix |
пользовательский контент после текста |
Компонент поддерживает множественный выбор элементов
через свойство multiple.
<n-tree-select
v-model:value="values"
:options="options"
multiple
/>
const values = ref([])
В этом режиме:
Поведение выбранных элементов можно настраивать.
Показывает полный путь к элементу:
<n-tree-select
v-model:value="value"
:options="options"
show-path
/>
Пример отображения:
Frontend / Vue
Это полезно, когда одинаковые названия встречаются в разных ветках дерева.
TreeSelect может работать в режиме каскадного выбора, когда выбор родителя автоматически влияет на потомков.
Свойство:
cascade
<n-tree-select
v-model:value="values"
:options="options"
multiple
cascade
/>
Особенности:
TreeSelect позволяет управлять раскрытием узлов дерева.
<n-tree-select
v-model:value="value"
:options="options"
:expanded-keys="expandedKeys"
/>
const expandedKeys = ref(['frontend'])
Это свойство задаёт список раскрытых элементов.
Компонент поддерживает встроенную функцию поиска по узлам дерева.
<n-tree-select
v-model:value="value"
:options="options"
filterable
/>
Появляется поле ввода, позволяющее:
Можно определить собственную функцию поиска.
<n-tree-select
v-model:value="value"
:options="options"
filterable
:filter="filter"
/>
const filter = (pattern, option) => {
return option.label.toLowerCase().includes(pattern.toLowerCase())
}
Параметры функции:
| Параметр | Значение |
|---|---|
pattern |
текст поиска |
option |
текущий узел |
Для больших деревьев используется ленивая загрузка данных.
Это позволяет загружать дочерние элементы только при раскрытии узла.
<n-tree-select
v-model:value="value"
:options="options"
:on-load="load"
/>
const load = async (node) => {
return new Promise((resolve) => {
setTimeout(() => {
node.children = [
{ label: 'Dynamic child 1', key: 'child1' },
{ label: 'Dynamic child 2', key: 'child2' }
]
resolve()
}, 1000)
})
}
Такой подход уменьшает:
TreeSelect поддерживает выбор с чекбоксами, что особенно полезно при множественном выборе.
<n-tree-select
v-model:value="values"
:options="options"
multiple
checkable
/>
Особенности:
cascadeСтратегия выбора настраивается через
checked-strategy.
Возможные варианты:
| Значение | Поведение |
|---|---|
all |
возвращаются все выбранные узлы |
parent |
возвращаются только родительские узлы |
child |
возвращаются только листовые элементы |
<n-tree-select
v-model:value="values"
:options="options"
multiple
checkable
checked-strategy="child"
/>
Это часто используется в системах управления правами доступа.
Некоторые элементы дерева можно сделать недоступными.
{
label: 'Backend',
key: 'backend',
disabled: true
}
Такой элемент:
TreeSelect поддерживает кастомизацию отображения узлов.
Свойство:
render-label
<n-tree-select
v-model:value="value"
:options="options"
:render-label="renderLabel"
/>
const renderLabel = ({ option }) => {
return h(
'span',
{ style: 'color: blue' },
option.label
)
}
Возможности кастомизации:
TreeSelect поддерживает несколько размеров.
size="small"
size="medium"
size="large"
Пример:
<n-tree-select
size="large"
:options="options"
/>
Текст, отображаемый при отсутствии выбранного значения.
placeholder="Выберите категорию"
Для удобства пользователя можно добавить кнопку очистки.
clearable
Пример:
<n-tree-select
v-model:value="value"
:options="options"
clearable
/>
По умолчанию ширина меню совпадает с шириной поля ввода.
Изменение поведения:
:consistent-menu-width="false"
Теперь ширина меню определяется содержимым.
TreeSelect генерирует события, позволяющие отслеживать изменения.
Вызывается при изменении выбранного значения.
<n-tree-select
:options="options"
@update:value="handleChange"
/>
const handleChange = (value) => {
console.log(value)
}
Срабатывает при раскрытии или закрытии узлов.
@n-tree-select
@update:expanded-keys="handleExpand"
Используется для ленивой загрузки узлов.
При работе с большими деревьями важно учитывать оптимизацию:
Рекомендации
TreeSelect полностью типизирован.
Пример использования типов:
import type { TreeOption } from 'naive-ui'
const options: TreeOption[] = [
{
label: 'Node',
key: 'node'
}
]
Преимущества:
TreeSelect легко интегрируется с компонентом формы.
Пример:
<n-form>
<n-form-item label="Категория">
<n-tree-select
v-model:value="value"
:options="options"
/>
</n-form-item>
</n-form>
Это позволяет:
TreeSelect часто применяется в более сложных интерфейсах.
Используется для выбора:
Структура дерева может повторять архитектуру приложения.
Позволяет выбирать категории из иерархии:
Электроника
├─ Компьютеры
├─ Смартфоны
└─ Телевизоры
Применяется для отображения:
| Свойство | Назначение |
|---|---|
options |
структура дерева |
value |
выбранное значение |
multiple |
множественный выбор |
filterable |
включение поиска |
checkable |
чекбоксы |
cascade |
каскадный выбор |
show-path |
отображение пути |
expanded-keys |
раскрытые узлы |
clearable |
очистка значения |
Каждый узел дерева обязан иметь уникальное значение
key.
Ошибка:
Duplicate key
children должен быть массивом объектов
TreeOption.
Неверно:
children: {}
Верно:
children: []
При множественном выборе value должен быть массивом.
const value = ref([])
Компонент предоставляет:
TreeSelect является одним из наиболее функциональных компонентов библиотеки Naive UI и используется при разработке сложных административных интерфейсов, систем управления данными и корпоративных приложений на базе Vue.js.