Компонент Tree предназначен для отображения иерархических структур данных. Он используется для представления вложенных объектов: каталогов файловой системы, категорий товаров, структуры организации, меню навигации и других древовидных данных.
Tree позволяет:
Компонент поддерживает большое количество параметров конфигурации, что делает его гибким инструментом для построения сложных интерфейсов.
Минимальная конфигурация Tree включает передачу массива данных и указание структуры полей.
<template>
<el-tree :data="data" />
</template>
<script setup>
const data = [
{
label: 'Уровень 1',
children: [
{
label: 'Уровень 2-1',
children: [
{ label: 'Уровень 3-1' }
]
}
]
},
{
label: 'Уровень 1-2'
}
]
</script>
Каждый объект может содержать:
| Поле | Назначение |
|---|---|
| label | текст узла |
| children | дочерние элементы |
Tree автоматически распознаёт вложенность и строит иерархическую структуру.
В реальных проектах данные редко используют имена label
и children. Компонент позволяет задать собственные названия
полей.
<template>
<el-tree
:data="data"
:props="defaultProps"
/>
</template>
<script setup>
const defaultProps = {
children: 'nodes',
label: 'name'
}
const data = [
{
name: 'Категория',
nodes: [
{ name: 'Подкатегория' }
]
}
]
</script>
Параметры props:
| Параметр | Назначение |
|---|---|
| children | поле дочерних элементов |
| label | отображаемый текст |
| disabled | признак отключения узла |
| isLeaf | признак листового элемента |
По умолчанию дерево отображается свернутым. Раскрытие можно настроить несколькими способами.
<el-tree
:data="data"
default-expand-all
/>
<el-tree
:data="data"
:default-expanded-keys="[1, 3]"
node-key="id"
/>
Здесь:
node-key определяет уникальный идентификатор узлаdefault-expanded-keys содержит список узлов для
раскрытияTree поддерживает одиночный выбор элемента.
<el-tree
:data="data"
node-key="id"
highlight-current
@node-click="handleNodeClick"
/>
Обработчик события:
function handleNodeClick(data) {
console.log(data)
}
Параметр highlight-current подсвечивает выбранный
элемент.
Tree может отображать чекбоксы рядом с каждым узлом.
<el-tree
:data="data"
show-checkbox
node-key="id"
/>
При включении чекбоксов появляется возможность множественного выбора.
Чекбоксы могут автоматически синхронизироваться между родительскими и дочерними элементами.
Стандартное поведение:
Отключение этой логики:
<el-tree
:data="data"
show-checkbox
node-key="id"
:check-strictly="true"
/>
Теперь каждый чекбокс работает независимо.
Tree предоставляет методы для получения выбранных узлов.
const checkedKeys = treeRef.value.getCheckedKeys()
const checkedNodes = treeRef.value.getCheckedNodes()
Пример:
<template>
<el-tree
ref="treeRef"
:data="data"
show-checkbox
node-key="id"
/>
</template>
<script setup>
import { ref } from 'vue'
const treeRef = ref()
</script>
При работе с большими структурами данных удобно загружать узлы по мере раскрытия.
Для этого используется режим lazy loading.
<el-tree
lazy
:load="loadNode"
node-key="id"
/>
Функция загрузки:
const loadNode = (node, resolve) => {
if (node.level === 0) {
return resolve([
{ id: 1, label: 'Узел 1' },
{ id: 2, label: 'Узел 2' }
])
}
setTimeout(() => {
resolve([
{ id: node.data.id * 10, label: 'Подузел' }
])
}, 500)
}
Параметры функции:
| Параметр | Назначение |
|---|---|
| node | текущий узел |
| resolve | функция передачи загруженных данных |
Некоторые элементы дерева можно сделать недоступными.
const data = [
{
label: 'Категория',
disabled: true
}
]
Отключенный узел:
Tree поддерживает поиск по узлам.
<template>
<el-input v-model="filterText" placeholder="Поиск" />
<el-tree
ref="treeRef"
:data="data"
:filter-node-method="filterNode"
/>
</template>
Функция фильтрации:
const filterNode = (value, data) => {
if (!value) return true
return data.label.includes(value)
}
Наблюдение за изменением строки поиска:
watch(filterText, val => {
treeRef.value.filter(val)
})
Tree позволяет полностью изменить внешний вид узла.
<el-tree :data="data">
<template #default="{ node, data }">
<span>
? {{ data.label }}
</span>
</template>
</el-tree>
Доступные параметры слота:
| Параметр | Назначение |
|---|---|
| node | объект узла |
| data | данные узла |
Это позволяет:
Tree предоставляет API для программного управления.
Выбирает узел программно.
treeRef.value.setCurrentKey(5)
Возвращает выбранный узел.
treeRef.value.getCurrentNode()
Добавляет дочерний элемент.
treeRef.value.append(
{ label: 'Новый элемент' },
parentNode
)
Удаляет узел.
treeRef.value.remove(node)
Обновляет дочерние элементы узла.
treeRef.value.updateKeyChildren(
nodeKey,
newChildren
)
Компонент генерирует события для отслеживания действий пользователя.
| Событие | Описание |
|---|---|
| node-click | клик по узлу |
| node-contextmenu | контекстное меню |
| check | изменение чекбокса |
| check-change | изменение состояния узла |
| node-expand | раскрытие узла |
| node-collapse | сворачивание узла |
Пример:
<el-tree
:data="data"
@node-expand="handleExpand"
/>
При работе с большими деревьями важно учитывать несколько факторов:
1. Lazy loading
Позволяет загружать только необходимые части структуры.
2. Уникальные ключи
Всегда использовать node-key, чтобы Vue корректно
отслеживал изменения.
3. Ограничение глубины
Чрезмерно глубокие деревья ухудшают производительность DOM.
На практике структура дерева часто выглядит следующим образом:
const data = [
{
id: 1,
label: 'Документы',
children: [
{
id: 2,
label: 'Отчёты',
children: [
{
id: 3,
label: '2024'
}
]
}
]
}
]
Такой формат:
Tree часто применяется для создания навигационных панелей.
Пример структуры:
Панель управления
├ Пользователи
│ ├ Список
│ └ Роли
├ Заказы
└ Настройки
Каждый узел может содержать маршрут:
{
label: 'Пользователи',
route: '/users'
}
Обработчик клика:
function handleNodeClick(data) {
router.push(data.route)
}
Такой подход позволяет использовать Tree как полноценное меню приложения.
Компонент Tree используется во множестве интерфейсных решений:
Гибкость конфигурации, поддержка ленивой загрузки, программного управления и кастомизации отображения делает Tree одним из наиболее мощных компонентов библиотеки Element Plus для работы с иерархическими структурами данных.