Lewati ke konten

Tree

Hirarki yang dapat diperluas dan dipilih - file browsers, nested settings, org structures - dibangun di atas primitif Tree milik Reka UI.

Penggunaan

items adalah array bersarang - node dengan children merender sebagai baris yang dapat diperluas, node tanpanya merender sebagai leaf. Klik baris untuk memperluasnya (dan memilihnya, jika ia adalah leaf):

  • Notes.txt
vue
<script setup lang="ts">
const items = [
  {
    label: 'Documents',
    value: 'documents',
    children: [
      { label: 'Resume.pdf', value: 'resume' },
      { label: 'Cover Letter.docx', value: 'cover-letter' },
    ],
  },
  { label: 'Notes.txt', value: 'notes' },
]
</script>

<template>
  <STree :items="items" />
</template>

Multiple selection

multiple membuat v-model menjadi array daripada satu node. default-expanded (array keys) membuka cabang segera, tanpa perlu klik:

  • Frontend
  • Vue
  • Svelte
  • Backend
  • Node
  • Go

0 selected

vue-html
<STree v-model="selected" :items="items" multiple :default-expanded="['frontend', 'backend']" />

Checkbox mode

checkbox menunjukkan checkbox tri-state per baris (menggunakan model checked/unchecked/indeterminate milik SCheckbox sendiri) dan mengaktifkan multiple bersama propagasi parent↔child: memilih parent mencentang setiap descendant, dan mencentang semua child node mencentang parent juga (mencentang sebagian menandainya indeterminate sebagai gantinya):

  • Permissions
  • Read
  • Write
  • Admin
vue-html
<STree v-model="selected" :items="items" checkbox :default-expanded="['permissions']" />

Konten item kustom

Slot item menggantikan konten ikon+label default baris, di-scope dengan node itu sendiri plus state expanded/selected/indeterminate live:

  • Reports
  • Daily3
  • Weekly12
vue-html
<STree :items="items">
  <template #item="{ item }">
    <span class="flex flex-1 items-center justify-between">
      <span>{{ item.label }}</span>
      <SBadge v-if="item.badge" :label="item.badge" size="sm" variant="soft" />
    </span>
  </template>
</STree>

Disabled items

disabled: true pada node memblokir hanya baris itu - siblings tetap interaktif:

  • Team
  • Members
  • Billing
  • Danger zone
vue-html
<STree :items="items" />
ts
const items = [
  { label: 'Members', value: 'members' },
  { label: 'Billing', value: 'billing', disabled: true },
]

Custom :ui

Untuk melihat dengan tepat apa yang akan Anda timpa - kelas default untuk setiap slot dan varian - berikut adalah file tema Tree sendiri:

Theme source "tree" not found

Props

PropTipeDefault
colorColorRoleprimary
itemsTreeItemType[]- (required)
modelValueTreeItemType | TreeItemType[]-
defaultValueTreeItemType | TreeItemType[]-
expandedstring[]-
defaultExpandedstring[]-
multiplebooleanfalse
checkboxbooleanfalse
propagateSelectbooleanfalse
bubbleSelectbooleanfalse
disabledbooleanfalse
getKey(item: TreeItemType) => stringitem => item.value ?? item.label
getChildren(item: TreeItemType) => TreeItemType[] | undefineditem => item.children
size'sm' | 'md' | 'lg'md
uiPartial<Record<TreeSlot, string | object>>-

Events

EventPayloadDeskripsi
update:modelValueTreeItemType | TreeItemType[]Terpicu saat seleksi
update:expandedstring[]Terpicu saat baris diperluas atau diciutkan

Slots

SlotPropsDeskripsi
item{ item, level, expanded, selected, indeterminate }Menggantikan konten ikon+label default baris