Tree Select — это компонент пользовательского интерфейса, объединяющий возможности древовидного представления данных и выпадающего списка выбора. Он используется для выбора одного или нескольких элементов из иерархической структуры.
В интерфейсах управления данными Tree Sel ect особенно полезен в ситуациях, когда элементы логически сгруппированы и образуют структуру родитель–потомок:
Компонент сочетает удобство поиска и компактность выпадающего списка с наглядностью дерева.
В библиотеке Element Plus Tree Select реализован как
компонент ElTreeSelect.
Для использования компонента необходимо импортировать его из Element Plus.
import { ElTreeSelect } fr om 'element-plus'
При глобальной регистрации Element Plus компонент доступен автоматически.
В шаблоне Vue он используется следующим образом:
<el-tree-select
v-model="value"
:data="data"
placeholder="Выберите элемент"
/>
Минимальная конфигурация Tree Sel ect требует:
<template>
<el-tree-select
v-model="value"
:data="data"
placeholder="Выберите категорию"
/>
</template>
<script setup>
import { ref } fr om 'vue'
const value = ref(null)
const data = [
{
value: 1,
label: 'Фрукты',
children: [
{ value: 2, label: 'Яблоки' },
{ value: 3, label: 'Апельсины' }
]
},
{
value: 4,
label: 'Овощи',
children: [
{ value: 5, label: 'Картофель' },
{ value: 6, label: 'Морковь' }
]
}
]
</script>
Каждый элемент дерева представляет объект со следующими полями:
| Поле | Описание |
|---|---|
| value | уникальное значение узла |
| label | отображаемый текст |
| children | массив дочерних элементов |
Tree Sel ect поддерживает множественный выбор. Для
этого используется свойство multiple.
<el-tree-select
v-model="value"
:data="data"
multiple
/>
v-model содержит массив значенийconst value = ref([])
Для множественного выбора в дереве включаются чекбоксы через свойство:
show-checkbox
<el-tree-select
v-model="value"
:data="data"
show-checkbox
multiple
/>
Чекбоксы позволяют выбирать:
По умолчанию выбор узлов связан иерархически:
Свойство check-strictly отключает эту связь.
<el-tree-select
v-model="value"
:data="data"
show-checkbox
check-strictly
/>
| Состояние | Поведение |
|---|---|
| check-strictly = false | родитель и потомки связаны |
| check-strictly = true | каждый узел выбирается независимо |
Компонент позволяет изменить названия полей в структуре данных.
Для этого используется свойство props.
<el-tree-select
v-model="value"
:data="data"
:props="props"
/>
const props = {
value: 'id',
label: 'name',
children: 'nodes'
}
const data = [
{
id: 1,
name: 'Документы',
nodes: [
{ id: 2, name: 'PDF' },
{ id: 3, name: 'Word' }
]
}
]
По умолчанию узлы дерева свернуты. Для автоматического раскрытия используется свойство:
default-expand-all
<el-tree-select
v-model="value"
:data="data"
default-expand-all
/>
Все узлы дерева раскрываются при отображении.
В крупных системах дерево может содержать тысячи элементов. В этом случае используется ленивая загрузка (lazy loading).
| Свойство | Назначение |
|---|---|
| lazy | включает ленивую загрузку |
| load | функция загрузки детей |
<el-tree-select
v-model="value"
lazy
:load="loadNode"
/>
const loadNode = (node, resolve) => {
if (node.level === 0) {
resolve([
{ value: 1, label: 'Раздел 1' },
{ value: 2, label: 'Раздел 2' }
])
} else {
resolve([
{ value: node.value + '-1', label: 'Подраздел 1' },
{ value: node.value + '-2', label: 'Подраздел 2' }
])
}
}
Параметры функции:
| Параметр | Описание |
|---|---|
| node | текущий узел |
| resolve | функция возврата данных |
Tree Select поддерживает встроенный поиск.
Для включения используется свойство:
filterable
<el-tree-select
v-model="value"
:data="data"
filterable
/>
При вводе текста дерево фильтруется по совпадению с
label.
Можно определить собственную функцию фильтрации.
<el-tree-select
v-model="value"
:data="data"
filterable
:filter-node-method="filterNode"
/>
const filterNode = (value, data) => {
if (!value) return true
return data.label.toLowerCase().includes(value.toLowerCase())
}
Отдельные элементы дерева можно сделать недоступными для выбора.
Для этого используется поле:
disabled
const data = [
{
value: 1,
label: 'Администрирование',
disabled: true
},
{
value: 2,
label: 'Пользователи'
}
]
Отключенные элементы:
В некоторых интерфейсах разрешается выбирать только конечные элементы дерева.
Для этого применяется:
check-on-click-node
и логика фильтрации узлов.
Также используется свойство:
render-after-expand
для оптимизации отображения.
Для кастомизации отображения узлов используется слот
render-content.
<el-tree-select
v-model="value"
:data="data"
>
<template #default="{ data }">
<span>
{{ data.label }}
<small>({{ data.value }})</small>
</span>
</template>
</el-tree-select>
Это позволяет добавлять:
Компонент поддерживает ряд событий.
Срабатывает при изменении выбранного значения.
<el-tree-select
v-model="value"
:data="data"
@change="handleChange"
/>
const handleChange = (val) => {
console.log(val)
}
Вызывается при клике по узлу дерева.
<el-tree-select
v-model="value"
:data="data"
@node-click="handleNodeClick"
/>
Срабатывает при открытии и закрытии выпадающего списка.
<el-tree-select
v-model="value"
:data="data"
@visible-change="handleVisible"
/>
Можно контролировать раскрытие узлов через:
default-expanded-keys
<el-tree-select
v-model="value"
:data="data"
:default-expanded-keys="[1,2]"
/>
Здесь автоматически раскрываются узлы с value = 1 и
value = 2.
Иногда необходимо показывать полный путь элемента.
Для этого используется свойство:
show-all-levels
Категории / Электроника / Смартфоны
Это улучшает понимание структуры дерева.
Для визуального разделения узлов можно добавить иконки.
import { Folder, Document } fr om '@element-plus/icons-vue'
<el-tree-select
v-model="value"
:data="data"
>
<template #default="{ data }">
<el-icon v-if="data.children">
<Folder />
</el-icon>
<el-icon v-else>
<Document />
</el-icon>
{{ data.label }}
</template>
</el-tree-select>
При работе с большими деревьями необходимо учитывать:
1. Ленивую загрузку
lazy
2. Рендеринг после раскрытия
render-after-expand
3. Ограничение глубины дерева
Чрезмерная вложенность ухудшает UX.
Каталог
├ Электроника
│ ├ Телефоны
│ ├ Ноутбуки
└ Бытовая техника
Компания
├ Отдел разработки
├ Отдел маркетинга
└ HR
Мир
├ Европа
│ ├ Германия
│ └ Франция
└ Азия
| Свойство | Описание |
|---|---|
| data | данные дерева |
| multiple | множественный выбор |
| show-checkbox | отображение чекбоксов |
| filterable | поиск |
| lazy | ленивое построение дерева |
| load | функция загрузки |
| default-expand-all | раскрытие всех узлов |
| check-strictly | независимый выбор |
| props | настройка структуры данных |
Tree Select построен на основе двух компонентов Element Plus:
Внутри компонента:
v-model.Такая архитектура обеспечивает: