Skip to content

树形数据(useTree)

树形数据管理 Hook,提供扁平化、展开/折叠、选中/级联、搜索过滤、懒加载等功能。

基础用法

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

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

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

API

参数

属性类型必填默认值说明
dataRef<TreeNode[]>-树形数据(响应式)
keyFieldstring'id'主键字段名
labelFieldstring'label'标签字段名
childrenFieldstring'children'子节点字段名
selectModestring'single'选择模式
isLazybooleanfalse是否启用懒加载

selectMode 可选值

说明
single单选
multiple多选
check-cascade级联选择(父子联动)

TreeNode

属性类型必填说明
idstring | number节点唯一标识
labelstring节点标签
childrenTreeNode[]子节点列表
isDisabledboolean是否禁用
isLeafboolean是否为叶子节点

FlatNode

属性类型说明
nodeTreeNode原始节点
levelnumber层级
parentKeystring | number | null父节点 key
expandedboolean是否展开
isLeafboolean是否叶子节点
hasChildrenboolean是否有子节点
visibleboolean是否可见(搜索过滤)
checkedboolean是否选中
indeterminateboolean是否半选

返回值

属性/方法类型说明
flatNodesComputedRef<FlatNode[]>扁平化后的节点列表
expandedKeysRef<Set<string | number>>展开的节点 key 集合
checkedKeysRef<Set<string | number>>选中的节点 key 集合
selectedKeyRef<string | number | null>当前选中的 key
toggleExpand(key: string | number) => void切换展开/折叠
toggleCheck(key: string | number) => void切换选中状态
selectNode(key: string | number) => void选择节点(单选)
expandAll() => void展开所有节点
collapseAll() => void折叠所有节点
filterNodes(query: string) => void搜索过滤
loadChildren(key: string | number, children: TreeNode[]) => void懒加载子节点
getCheckedNodes() => TreeNode[]获取选中的节点
getExpandedKeys() => (string | number)[]获取展开的 key 列表
setExpandedKeys(keys: (string | number)[]) => void设置展开的 key 列表
appendNode(parentKey: string | number | null, node: TreeNode) => void添加节点
removeNode(key: string | number) => void移除节点
updateNode(key: string | number, data: Partial<TreeNode>) => void更新节点

示例

展开/折叠

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

// 切换单个节点
toggleExpand(1)

// 展开所有
expandAll()

// 折叠所有
collapseAll()

级联选择

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

// 选中节点(自动联动子节点)
toggleCheck(1)

// 获取所有选中节点
const checked = getCheckedNodes()
console.log(checked)

// 监听选中变化
watch(checkedKeys, (keys) => {
  console.log('选中的 keys:', Array.from(keys))
})

搜索过滤

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

// 过滤节点
filterNodes('关键词')

// 获取过滤后的节点
console.log(flatNodes.value.filter(n => n.visible))

动态操作

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

// 添加子节点
appendNode(1, { id: 13, label: '节点1-3' })

// 移除节点
removeNode(11)

// 更新节点
updateNode(1, { label: '新节点1' })

懒加载

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

// 监听展开事件,加载子节点
const handleExpand = (node) => {
  if (node.children.length === 0) {
    // 异步加载子节点
    fetchChildren(node.id).then((children) => {
      loadChildren(node.id, children)
    })
  }
}

辽 ICP 备 2025070134 号