Skip to content

Tree Data(useTree)

Tree data management Hook providing flattening, expand/collapse, selection/cascade, search filtering, and lazy loading.

Basic Usage

typescript
import { ref } from 'vue'
import { useTree } from '@/uni_modules/see-u-ui/utils/hooks/useTree'

const treeData = ref([
  {
    id: 1,
    label: 'Node 1',
    children: [
      { id: 11, label: 'Node 1-1' },
      { id: 12, label: 'Node 1-2' }
    ]
  }
])

const { flatNodes, toggleExpand, expandAll, collapseAll } = useTree({
  data: treeData
})

API

Options

PropertyTypeRequiredDefaultDescription
dataRef<TreeNode[]>Yes-Tree data (reactive)
keyFieldstringNo'id'Key field name
labelFieldstringNo'label'Label field name
childrenFieldstringNo'children'Children field name
selectModestringNo'single'Selection mode
isLazybooleanNofalseWhether lazy loading

selectMode Values

ValueDescription
singleSingle select
multipleMultiple select
check-cascadeCascade selection (parent-child linked)

TreeNode

PropertyTypeRequiredDescription
idstring | numberYesNode unique identifier
labelstringYesNode label
childrenTreeNode[]NoChildren nodes
isDisabledbooleanNoWhether disabled
isLeafbooleanNoWhether leaf node

FlatNode

PropertyTypeDescription
nodeTreeNodeOriginal node
levelnumberNesting level
parentKeystring | number | nullParent node key
expandedbooleanWhether expanded
isLeafbooleanWhether leaf node
hasChildrenbooleanWhether has children
visiblebooleanWhether visible (search filter)
checkedbooleanWhether checked
indeterminatebooleanWhether indeterminate

Returns

Property/MethodTypeDescription
flatNodesComputedRef<FlatNode[]>Flattened node list
expandedKeysRef<Set<string | number>>Expanded node keys
checkedKeysRef<Set<string | number>>Checked node keys
selectedKeyRef<string | number | null>Currently selected key
toggleExpand(key: string | number) => voidToggle expand/collapse
toggleCheck(key: string | number) => voidToggle check state
selectNode(key: string | number) => voidSelect node (single)
expandAll() => voidExpand all nodes
collapseAll() => voidCollapse all nodes
filterNodes(query: string) => voidSearch filter
loadChildren(key: string | number, children: TreeNode[]) => voidLazy load children
getCheckedNodes() => TreeNode[]Get checked nodes
getExpandedKeys() => (string | number)[]Get expanded keys
setExpandedKeys(keys: (string | number)[]) => voidSet expanded keys
appendNode(parentKey: string | number | null, node: TreeNode) => voidAdd node
removeNode(key: string | number) => voidRemove node
updateNode(key: string | number, data: Partial<TreeNode>) => voidUpdate node

Examples

Expand/Collapse

typescript
const { toggleExpand, expandAll, collapseAll } = useTree({ data: treeData })

// Toggle single node
toggleExpand(1)

// Expand all
expandAll()

// Collapse all
collapseAll()

Cascade Selection

typescript
const { toggleCheck, getCheckedNodes, checkedKeys } = useTree({
  data: treeData,
  selectMode: 'check-cascade'
})

// Check node (auto-links children)
toggleCheck(1)

// Get all checked nodes
const checked = getCheckedNodes()
console.log(checked)

// Watch checked changes
watch(checkedKeys, (keys) => {
  console.log('Checked keys:', Array.from(keys))
})

Search Filter

typescript
const { filterNodes, flatNodes } = useTree({ data: treeData })

// Filter nodes
filterNodes('keyword')

// Get filtered nodes
console.log(flatNodes.value.filter(n => n.visible))

Dynamic Operations

typescript
const { appendNode, removeNode, updateNode } = useTree({ data: treeData })

// Add child node
appendNode(1, { id: 13, label: 'Node 1-3' })

// Remove node
removeNode(11)

// Update node
updateNode(1, { label: 'New Node 1' })

Lazy Loading

typescript
const { toggleExpand, loadChildren } = useTree({
  data: treeData,
  isLazy: true
})

// Listen for expand events, load children
const handleExpand = (node) => {
  if (node.children.length === 0) {
    // Async load children
    fetchChildren(node.id).then((children) => {
      loadChildren(node.id, children)
    })
  }
}

Liao ICP No. 2025070134