Skyroc UI
数据展示

Tree

用于展示层级数据并支持展开、选择和虚拟滚动的树组件

Tree 用于展示文件目录、组织结构、分类层级等嵌套数据。组件提供数据驱动的高层 Tree、可完全自定义渲染的 TreeRoot / TreeItem,以及面向大数据量的 TreeVirtualizer

import { Tree, TreeItem, TreeRoot, TreeVirtualizer } from '@skyroc/web-ui';

何时使用

  • 需要展示父子层级结构,如目录、菜单、分类、权限树。
  • 需要在层级节点上进行单选或多选。
  • 需要自定义节点内容,如图标、状态、徽标或操作区。
  • 数据量较大且展开后节点很多时,使用 TreeVirtualizer

基础用法

通过 items 传入树数据。每个节点至少需要 valuelabel,有子节点时使用 children

Preview
Code
Loading...
<Tree items={items} defaultExpanded={['components']} defaultValue="button" />

多选

设置 multiple 后,valuedefaultValue 使用字符串数组。默认 selectionBehavior="toggle",点击已选节点会取消选择。

Preview
Code
Loading...
<Tree multiple items={items} value={value} onValueChange={nextValue => setValue(nextValue as string[])} />

自定义渲染

通过 renderItem 自定义节点内容。回调会收到当前节点、展开状态、选中状态、半选状态以及树级操作方法。

Preview
Code
Loading...
<Tree
  items={items}
  renderItem={({ item, isExpanded, hasChildren }) => (
    <>
      {hasChildren ? <FolderIcon open={isExpanded} /> : <FileIcon />}
      <span>{item.data.label}</span>
    </>
  )}
/>

虚拟滚动

TreeVirtualizer 适合展开后节点数量较多的场景。需要设置 height,并通过 itemSize 提供预估行高。

Preview
Code
Loading...
<TreeVirtualizer height={300} itemSize={36} items={items} />

选择传播

Tree 支持父子节点选择联动:

属性说明
allowParentSelect允许选中有子节点的父节点
propagateSelect多选时选中父节点会向下联动选择子节点
bubbleSelect多选时子节点全选后向上联动选择父节点
selectionBehaviortoggle 可取消已选节点,replace 替换选择
<Tree multiple allowParentSelect propagateSelect bubbleSelect items={items} />

展开行为

defaultExpanded 设置非受控初始展开项,expanded + onExpandedChange 用于受控展开。toggleBehavior="single" 会让同层路径保持单展开。

<Tree expanded={expanded} toggleBehavior="single" onExpandedChange={setExpanded} />

API

Tree

高层数据驱动组件。继承 TreeRoot 的状态能力,并自动渲染 TreeItem

属性说明类型默认值
items*树节点数据TreeItemData[]-
value受控选中值;单选为字符串,多选为字符串数组string | string[]-
defaultValue非受控默认选中值string | string[]-
onValueChange选中值变化时触发(value: string | string[]) => void-
expanded受控展开节点值列表string[]-
defaultExpanded非受控默认展开节点值列表string[][]
onExpandedChange展开值变化时触发(expanded: string[]) => void-
multiple是否启用多选booleanfalse
selectionBehavior选择行为;toggle 可取消已选节点,replace 替换当前选择'replace' | 'toggle''toggle'
toggleBehavior展开行为;single 保持单展开路径,multiple 允许多个节点展开'multiple' | 'single''multiple'
allowParentSelect是否允许选择有子节点的父节点booleanfalse
propagateSelect多选时是否将父节点选择向下传播给子节点booleanfalse
bubbleSelect多选时是否在子节点全选后向上选择父节点booleanfalse
disabled是否禁用整棵树booleanfalse
disabledSelect是否禁用节点选择booleanfalse
disabledToggle是否禁用节点展开/收起booleanfalse
indentSize每级缩进宽度,单位 pxnumber16
renderItem自定义节点内容渲染函数(props: TreeItemRenderProps & { item: FlattenedItem } & TreeRootRenderProps) => ReactNode-
className根节点自定义 classClassValue-
classNames各 slot 的自定义 class(root / item / virtualContainer / virtualContent)TreeClassNames-
top显示在树顶部的内容ReactNode-
bottom显示在树底部的内容ReactNode-

TreeRoot

底层根组件,负责状态、上下文和无序列表语义,节点渲染完全交给 children 函数。

属性说明类型默认值
children*自定义渲染函数,接收扁平节点列表、选中值、展开值和操作方法(props: TreeRootRenderProps) => ReactNode-
items*树节点数据TreeItemData[]-
value受控选中值string | string[]-
expanded受控展开节点值列表string[]-
multiple是否启用多选booleanfalse
className根节点自定义 classClassValue-

TreeItem

底层节点组件,必须放在 TreeRootTreeVirtualizer 上下文中使用。

属性说明类型默认值
value*节点唯一值string-
level*节点层级,从 1 开始number-
children节点内容,或接收节点状态的渲染函数ReactNode | (props: TreeItemRenderProps) => ReactNode-
disabled是否禁用当前节点boolean-
disabledSelect是否禁用当前节点选择boolean-
disabledToggle是否禁用当前节点展开/收起boolean-
indentSize每级缩进宽度,单位 pxnumber16
onSelect节点选择事件回调;可通过 preventDefault 阻止默认选择(event: TreeSelectEvent) => void-
onToggle节点展开/收起事件回调;可通过 preventDefault 阻止默认切换(event: TreeToggleEvent) => void-

TreeVirtualizer

虚拟滚动树组件。继承 Tree 状态能力,并使用 @tanstack/react-virtual 只渲染可视区域节点。

属性说明类型默认值
height*虚拟滚动容器高度number | string-
items*树节点数据TreeItemData[]-
itemSize预估节点高度,或根据索引返回高度的函数number | (index: number) => number36
overscan额外渲染的节点数量number5
dynamic是否使用动态节点高度测量模式booleanfalse
width虚拟滚动容器宽度number | string'100%'
onScroll滚动偏移变化时触发(offset: number) => void-
virtualizerRef虚拟滚动实例引用TreeVirtualizerRef-
classNames各 slot 的自定义 class,额外支持 virtualContainer / virtualContentTreeVirtualizerClassNames-

类型

TreeItemBaseData

树节点的基础数据结构。

字段类型说明
valuestring节点唯一值。
labelReactNode节点展示内容。
disabledboolean是否禁用节点。

TreeItemData

带 children 的树节点数据结构。

字段类型说明
...baseTreeItemBaseData基础节点字段。
childrenTreeItemData[]子节点列表。

FlattenedItem

Tree 内部渲染使用的扁平节点结构。

字段类型说明
_idstring内部唯一标识。
valuestring节点值。
labelReactNode节点标签。
dataTreeItemData原始节点数据。
levelnumber节点层级。
indexnumber同级索引。
parentTreeItemData父节点数据。
hasChildrenboolean是否有子节点。

TreeRootRenderProps

TreeRoot children 函数和 renderItem 可用的树级状态与操作。

字段类型说明
expandedstring[]当前展开节点值列表。
flattenItemsFlattenedItem[]当前可见的扁平节点列表。
modelValuestring | string[] | undefined当前选中值。
select(value: string) => void选择节点。
toggle(value: string) => void展开或收起节点。

TreeItemRenderProps

TreeItem children 函数和 Tree renderItem 可用的节点状态。

字段类型说明
hasChildrenboolean是否有子节点。
isExpandedboolean是否已展开。
isSelectedboolean是否已选中。
isIndeterminateboolean | undefined是否处于半选状态。

TreeClassNames

Tree 各 slot 的自定义 class。

字段类型说明
rootClassValue根节点 class。
itemClassValue节点 class。
itemIndicatorClassValue节点指示器 class。
itemChildrenClassValue子节点容器 class。
virtualContainerClassValue虚拟滚动容器 class。
virtualContentClassValue虚拟滚动内容层 class。

TreeProps

Tree 高层组件属性。

字段类型说明
itemsTreeItemData[]树节点数据。
valuestring | string[]受控选中值。
expandedstring[]受控展开值。
multipleboolean是否多选。
renderItem(props: TreeItemRenderProps & { item: FlattenedItem } & TreeRootRenderProps) => ReactNode自定义节点渲染函数。
classNamesTreeClassNames各 slot 的自定义 class。

TreeRootProps

TreeRoot 底层根组件属性。

字段类型说明
children(props: TreeRootRenderProps) => ReactNode自定义渲染函数。
itemsTreeItemData[]树节点数据。
valuestring | string[]受控选中值。
expandedstring[]受控展开值。
multipleboolean是否多选。
classNameClassValue根节点 class。

TreeItemProps

TreeItem 底层节点组件属性。

字段类型说明
valuestring节点唯一值。
levelnumber节点层级。
childrenReactNode | (props: TreeItemRenderProps) => ReactNode节点内容。
disabledboolean是否禁用节点。
onSelect(event: TreeSelectEvent) => void选择事件回调。
onToggle(event: TreeToggleEvent) => void展开/收起事件回调。

TreeVirtualizerProps

TreeVirtualizer 虚拟滚动树属性。

字段类型说明
heightnumber | string容器高度。
itemsTreeItemData[]树节点数据。
itemSizenumber | (index: number) => number预估节点高度。
overscannumber额外渲染节点数量。
dynamicboolean是否动态测量节点高度。
virtualizerRefTreeVirtualizerRef虚拟滚动引用。
classNamesTreeVirtualizerClassNames各 slot 的自定义 class。

TreeVirtualizerClassNames

TreeVirtualizer 支持的 classNames 结构。

字段类型说明
rootClassValue虚拟内容 ul 的 class。
itemClassValue节点 class。
virtualContainerClassValue滚动容器 class。
virtualContentClassValue虚拟内容层 class。

TreeVirtualizerRef

TreeVirtualizer 暴露的命令式引用。

字段类型说明
containerRefdiv element | null滚动容器元素。
flattenItemsFlattenedItem[]当前可见扁平节点。
scrollToIndex(index: number, options?) => void滚动到指定索引。
scrollToValue(value: string, options?) => void滚动到指定节点值。
virtualizerobject@tanstack/react-virtual 实例。

TreeSelectEvent

节点选择事件的 detail 字段。

字段类型说明
valuestring节点值。
isExpandedboolean事件发生前是否展开。
isSelectedboolean事件发生前是否选中。
originalEventnative mouse or keyboard event原始事件。

TreeToggleEvent

节点展开/收起事件的 detail 字段。

字段类型说明
valuestring节点值。
isExpandedboolean事件发生前是否展开。
isSelectedboolean事件发生前是否选中。
originalEventnative mouse or keyboard event原始事件。

TreeRootContextValue

Tree 内部上下文值,供底层 TreeItem 读取状态。

字段类型说明
itemsTreeItemData[]原始树数据。
expandedstring[]展开值列表。
selectedKeysstring[]选中值列表。
expandedItemsFlattenedItem[]当前可见扁平节点。
onSelect(value: string) => void选择节点。
onToggle(value: string) => void展开或收起节点。

StyledComponentProps<T>

项目内用于包装组件 props 的通用类型。

字段类型说明
...sourcePropsinherited props without className继承原始组件属性,但重新定义 className。
classNameClassValue组件 class。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'项目统一尺寸类型。

ClassValue

CSS 类名类型

string | null | undefined | Record<string, boolean> | ClassValue[]

On this page