Компонент Tree в Element Plus предназначен для
отображения иерархических структур данных, таких как каталоги, меню,
файловые системы и другие деревья. Основная структура данных для дерева
— массив объектов, где каждый объект представляет узел с обязательным
ключом label (или title) и при необходимости
массивом children для вложенных элементов.
const data = [
{
label: 'Фрукты',
children: [
{ label: 'Яблоки' },
{ label: 'Бананы' },
{ label: 'Апельсины' }
]
},
{
label: 'Овощи',
children: [
{ label: 'Морковь' },
{ label: 'Картофель' }
]
}
];
Для отображения дерева используется компонент
<el-tree> с передачей ему :data="data" и
настройкой ключей через props.
<el-tree
:data="data"
:props="{ label: 'label', children: 'children' }"
node-key="id"
default-expand-all>
</el-tree>
node-key — уникальный идентификатор узла,
необходимый для программного управления выборкой, раскрытием и другими
операциями. Если объект узла содержит свойство id, его
удобно использовать:
const data = [
{ id: 1, label: 'Фрукты', children: [{ id: 11, label: 'Яблоки' }] }
];
props позволяет настраивать соответствие полей данных структуре дерева:
label — название узла, отображаемое в дереве.children — массив дочерних элементов.disabled — отключение узла.isLeaf — принудительное определение узла как листа,
даже если children есть или нет.<el-tree
:data="data"
:props="{ label: 'label', children: 'children', disabled: 'disabled', isLeaf: 'isLeaf' }">
</el-tree>
Для динамического управления деревом используются
рефы и методы компонента. Доступ к дереву
осуществляется через ref:
<el-tree ref="treeRef" :data="data" node-key="id"></el-tree>
Методы, полезные для программного управления:
setChecked(key, checked, deep = false) — программная
установка состояния чекбокса узла.getCheckedKeys() — получение массива ключей всех
выбранных узлов.getCheckedNodes() — получение массива объектов
выбранных узлов.setCurrentKey(key) — программное выделение узла.getCurrentKey() — получение текущего выделенного
узла.expandNode(node, expandParents = false) — раскрытие
конкретного узла.collapseNode(node) — закрытие узла.expandAll() и collapseAll() —
раскрытие/сворачивание всех узлов.Пример программного раскрытия узла по ключу:
this.$refs.treeRef.setCurrentKey(11);
this.$refs.treeRef.expandNode(this.$refs.treeRef.getNode(1));
Компонент поддерживает ленивую загрузку через
load и lazy:
<el-tree
:data="rootNodes"
:props="defaultProps"
lazy
:load="loadNode"
node-key="id">
</el-tree>
const loadNode = (node, resolve) => {
if (node.level === 0) {
resolve([{ id: 1, label: 'Фрукты', isLeaf: false }]);
} else if (node.data.id === 1) {
setTimeout(() => {
resolve([{ id: 11, label: 'Яблоки', isLeaf: true }]);
}, 500);
} else {
resolve([]);
}
};
lazy — включает ленивую загрузку.load — функция, которая вызывается при раскрытии узла и
получает объект node и колбэк resolve для
передачи дочерних элементов.Для дерева с чекбоксами используется show-checkbox:
<el-tree
:data="data"
node-key="id"
show-checkbox
:check-strictly="true">
</el-tree>
show-checkbox — отображает чекбоксы.check-strictly — отключает автоматическую связь
состояния между родителями и детьми.default-checked-keys — массив ключей, которые будут
выбраны при инициализации.defaultCheckedKeys: [11, 12]
Метод filter позволяет программно фильтровать узлы по
определённому условию:
this.$refs.treeRef.filter(value => {
return value.label.includes('Ябл');
});
Фильтр скрывает узлы, которые не соответствуют условию. Для сброса
фильтра используется метод clearFilter().
Компонент Tree поддерживает большое количество событий для программного контроля:
node-click — клик по узлу.check-change — изменение состояния чекбокса.current-change — изменение текущего выбранного
узла.node-expand / node-collapse —
раскрытие/сворачивание узла.node-contextmenu — вызов контекстного меню на
узле.Пример отслеживания клика и выделения узла:
<el-tree
ref="treeRef"
:data="data"
node-key="id"
@node-click="handleNodeClick">
</el-tree>
methods: {
handleNodeClick(nodeData) {
console.log('Выбран узел:', nodeData.label);
}
}
Данные дерева можно обновлять в реальном времени, Vue автоматически отслеживает изменения:
this.data.push({ id: 3, label: 'Ягоды', children: [] });
Для обновления конкретного узла используется
getNode(key) и манипуляция с его свойствами:
const node = this.$refs.treeRef.getNode(1);
node.data.label = 'Фрукты и овощи';
Компонент поддерживает слоты и scoped slots для кастомного отображения узлов:
<el-tree :data="data" node-key="id">
<template #default="{ node, data }">
<span>{{ data.label }} (уровень {{ node.level }})</span>
</template>
</el-tree>
node.level — уровень узла в дереве.node.isLeaf — является ли узел листом.data — объект данных узла.Эти возможности позволяют использовать компонент Tree не только для статического отображения данных, но и для сложного программного управления структурой, выбора, фильтрации и динамической подгрузки информации в приложениях на Vue с использованием Element Plus.