Skip to content
API 风格:

Дерево-выбор ​

Комбинация: триггер-выпадашка + панель Tree. Одиночный выбор возвращает string, множественный (с чекбоксами) — string[].

Базовое использование ​

Одиночный выбор
vue
<script setup>
import { ref } from 'vue'
const treeValue = ref(undefined)
const treeData = [
  { key: 'a', label: 'Фронтенд', children: [
    { key: 'a-1', label: 'Vue' },
    { key: 'a-2', label: 'React' },
  ] },
  { key: 'b', label: 'Бэкенд' },
]
</script>

<template>
  <LhTreeSelect :data="treeData" v-model="treeValue" />
</template>
vue
<script>
export default {
  data() {
    return {
      treeValue: undefined,
      treeData: [
        { key: 'a', label: 'Фронтенд', children: [
          { key: 'a-1', label: 'Vue' },
          { key: 'a-2', label: 'React' },
        ] },
        { key: 'b', label: 'Бэкенд' },
      ],
    }
  },
}
</script>

<template>
  <LhTreeSelect :data="treeData" v-model="treeValue" />
</template>

Множественный выбор ​

Множественный выбор
vue
<script setup>
import { ref } from 'vue'
const treeMulti = ref([])
</script>

<template>
  <!-- Множественный выбор -->
  <LhTreeSelect :data="treeData" v-model="treeMulti" multiple placeholder="Выберите технологический стек" />
</template>
vue
<script>
export default {
  data() {
    return {
      treeMulti: [],
      treeData: [
        { key: 'a', label: 'Фронтенд', children: [
          { key: 'a-1', label: 'Vue' },
          { key: 'a-2', label: 'React' },
        ] },
        { key: 'b', label: 'Бэкенд' },
      ],
    }
  },
}
</script>

<template>
  <!-- Множественный выбор -->
  <LhTreeSelect :data="treeData" v-model="treeMulti" multiple placeholder="Выберите технологический стек" />
</template>

Отключение и место монтирования ​

disabled отключает селектор; teleported со значением false монтирует выпадающую панель на месте (без передачи в body).

Отключение / панель на месте
vue
<script setup>
import { ref } from 'vue'
const treeDisabled = ref([])
const treeLocal = ref([])
</script>

<template>
  <!-- Отключение -->
  <LhTreeSelect :data="treeData" v-model="treeDisabled" disabled />
  <!-- Панель на месте -->
  <LhTreeSelect :data="treeData" v-model="treeLocal" :teleported="false" />
</template>
vue
<script>
export default {
  data() {
    return {
      treeDisabled: [],
      treeLocal: [],
      treeData: [
        { key: 'a', label: 'Фронтенд', children: [
          { key: 'a-1', label: 'Vue' },
          { key: 'a-2', label: 'React' },
        ] },
        { key: 'b', label: 'Бэкенд' },
      ],
    }
  },
}
</script>

<template>
  <!-- Отключение -->
  <LhTreeSelect :data="treeData" v-model="treeDisabled" disabled />
  <!-- Панель на месте -->
  <LhTreeSelect :data="treeData" v-model="treeLocal" :teleported="false" />
</template>

API ​

LhTreeSelect Props ​

СвойствоОписаниеТипЗначение по умолчанию
dataданные дерева[LhTreeNode](#type-LhTreeNode)[]—
modelValueтекущее значение (одиночный выбор string / множественный string[], управляемый v-model)string | string[]—
multipleмножественный выбор (показываются чекбоксы, значение — массив ключей)booleanfalse
disabledотключеноbooleanfalse
placeholderплейсхолдерstring—
teleportedмонтировать ли панель в body (по умолчанию true)booleantrue
sxсвойства быстрой раскладки sxLhSxProps—

Events ​

СобытиеОписаниеКолбэк
update:modelValueвызывается при изменении выбранного значения, использовать совместно с v-model (одиночный выбор — string, множественный — string[])(value: string | string[] | undefined)
changeвызывается после изменения выбора(value: string | string[] | undefined)

Доступность ​

  • Триггер — настоящая <button>, aria-haspopup="tree" + aria-expanded отмечают состояние развёрнутости; панель — role="listbox" (при множественном выборе добавляется aria-multiselectable)
  • Внутри панели полностью переиспользуется навигация с клавиатуры по паттерну APG tree из Tree
  • Закрытие по щелчку вне компонента или нажатию Escape; после закрытия фокус возвращается триггеру

Определения типов ​

Ниже приведены структуры типов TypeScript, экспортируемые этим компонентом (автоматически извлечены из packages/components/tree-select/src/types.ts и исходников @lh-ui/share/core/*; раскройте каждый пункт, чтобы увидеть полное определение; описания свойств — в таблице Props выше):

LhTreeSelectProps
ts
export interface LhTreeSelectProps {
  /** данные дерева */
  data: LhTreeNode[]
  /** текущее значение (одиночный выбор string / множественный string[], управляемый v-model) */
  modelValue?: string | string[]
  /** множественный выбор (показываются чекбоксы, значение — массив ключей) */
  multiple?: boolean
  /** отключено */
  disabled?: boolean
  /** плейсхолдер */
  placeholder?: string
  /** монтировать ли панель в body (по умолчанию true) */
  teleported?: boolean
  /** sx: свойства быстрой раскладки */
  sx?: LhSxProps
}
LhTreeNode (из @lh-ui/share/core/tree)
ts
/** данные узла дерева */
export interface LhTreeNode {
  /** уникальный ключ */
  key: string
  /** отображаемый текст */
  label: string
  /** дочерние узлы */
  children?: LhTreeNode[]
  /** отключено */
  disabled?: boolean
  /** является ли листом (если не указано, выводится по children) */
  isLeaf?: boolean
}

Красота традиций — основа кода