# Дерево
Деревовидное отображение и выбор. Поддерживаются флажки (по умолчанию каскадная связь родитель-потомок + неопределённое состояние, checkStrictly разрывает связь), множественный выбор, ленивая загрузка (при разворачивании незагруженного узла вызывается load); все три управляемых ключа работают через .sync.
<template>
<div class="demo-col" style="max-width: 320px">
<p class="demo-note">Флажки + checkStrictly (без связи родитель-потомок) + ключи разворачивания / выделения / отметок по умолчанию</p>
<LhTree
:data="data"
show-checkbox
check-strictly
:default-expanded-keys="['song']"
:default-selected-keys="['xishan']"
:default-checked-keys="['libai']"
:expand-on-click-node="false"
@select="onSelect"
@check="onCheck"
/>
<p class="demo-note">Выделено кликом: {{ selected }}; ключи отметок: {{ checked.join(', ') || '(нет)' }}</p>
<p class="demo-note">multiple — множественный выбор + disabled отключает всё дерево</p>
<LhTree :data="data" multiple disabled :default-expanded-keys="['tang']" @select="onSelectMulti" />
<p class="demo-note">Результат множественного выбора: {{ multi.join(', ') || '(нет)' }}</p>
<p class="demo-note">Управляемые ключи: expandedKeys / selectedKeys / checkedKeys</p>
<LhTree
:data="data"
show-checkbox
:expanded-keys="['song']"
:selected-keys="['guo']"
:checked-keys="['xishan']"
@select="onSelect"
/>
<p class="demo-note">lazy — ленивая загрузка (при клике разворачивания вызывается load и подтягивает дочерние узлы)</p>
<LhTree :data="lazyData" lazy :load="onLoad" :default-expanded-keys="['root']" />
</div>
</template>
<script>
export default {
data: () => ({
selected: '(нет)',
checked: [],
multi: [],
data: [
{
key: 'tang',
label: 'Династия Тан',
children: [
{ key: 'wangwei', label: 'Ван Вэй' },
{ key: 'libai', label: 'Ли Бо' },
],
},
{
key: 'song',
label: 'Династия Сун',
children: [
{
key: 'fan',
label: 'Фань Куань',
children: [{ key: 'xishan', label: 'Путешествие по горам и рекам' }],
},
{ key: 'guo', label: 'Го Си' },
],
},
],
lazyData: [{ key: 'root', label: 'Жанры живописи (кликните для ленивой загрузки)' }],
}),
methods: {
onSelect(key) {
this.selected = String(key)
},
onCheck(keys) {
this.checked = Array.isArray(keys) ? keys : []
},
onSelectMulti(keys) {
this.multi = Array.isArray(keys) ? keys : [String(keys)]
},
onLoad(node, resolve) {
setTimeout(() => {
var _a, _b
resolve([
{ key: `${String((_a = node.key) !== null && _a !== void 0 ? _a : '')}-a`, label: 'Пейзаж' },
{ key: `${String((_b = node.key) !== null && _b !== void 0 ? _b : '')}-b`, label: 'Цветы и птицы' },
])
}, 400)
},
},
}
</script>
# Props
| Проп | Описание | Тип | По умолчанию |
|---|---|---|---|
| data | Данные дерева | LhTreeNode[] | [] |
| showCheckbox | Показывать флажки | boolean | false |
| multiple | Множественный выбор (клик по узлу переключает выделение, а не заменяет его) | boolean | false |
| expandOnClickNode | Разворот / свёртка при клике по узлу, не являющемуся листом | boolean | false |
| defaultExpandedKeys / expandedKeys | Ключи развёрнутых узлов по умолчанию / управляемые | string[] | — |
| defaultSelectedKeys / selectedKeys | Ключи выделенных узлов по умолчанию / управляемые | string[] | — |
| defaultCheckedKeys / checkedKeys | Ключи отмеченных узлов по умолчанию / управляемые | string[] | — |
| checkStrictly | Отметки родителя и потомка не связаны (без каскада и неопределённого состояния) | boolean | false |
| lazy | Ленивая загрузка: при разворачивании незагруженного узла, не являющегося листом, вызывается load | boolean | false |
| load | Коллбэк ленивой загрузки: resolve(children) передаёт данные и разворачивает, reject() отменяет | (node, resolve, reject) => void | — |
| disabled | Полное отключение | boolean | false |
| sx | Компактная раскладка через sx | — | — |
# Events
update:expandedKeys, update:selectedKeys, update:checkedKeys (все через .sync),
expand (key, isExpanded), select (key, node), check (keys, node), nodeLoad (node, children)
# Slots
| Слот | Описание |
|---|---|
| node | Метка узла, областные параметры { node, level, expanded, selected } |
| empty | Содержимое при отсутствии данных (по умолчанию «Нет данных») |
# Доступность
Узлы — role="treeitem" + aria-expanded (разворачиваемые узлы) + aria-selected / aria-checked;
контейнер — role="tree"; поддерживаются стрелки вверх / вниз для перемещения, вправо / влево для разворота / свёртки, пробел для отметки, Enter для выделения.
Copyright © 2024-2026 FengMo WenXue