Skip to content

FxTree 树形控件

FxTree 属于 @fx/components,不依赖任何 UI 框架。内部组合 FxTreeNode(递归)+ FxCheckbox + FxIcon + FxCollapseTransition

用层级结构展示一组数据。

基础用法

基础的树形结构。

可选择

用于节点选择。

WARNING

使用 show-checkbox 时,由于 check-on-click-leaf 默认为 true,点击叶子节点(最末级)会同时切换其勾选状态。

懒加载自定义叶子节点

懒加载模式下,节点的数据在点击后才会请求,因此 Tree 无法预判某节点是否为叶子。默认会给每个节点渲染展开箭头,若是叶子则在点击后消失。你也可以通过 props.isLeaf 提前告知 Tree 某节点是否为叶子,从而避免渲染展开箭头。

多次懒加载

远程懒加载节点数据时可能加载失败。此时可调用 reject 保持节点状态不变,允许再次远程加载。

禁用 checkbox

可将节点的 checkbox 设为禁用。示例中 defaultProps 声明了 disabled 字段,并将部分节点设为 disabled: true,对应的 checkbox 进入禁用态、不可点击。

默认展开与默认勾选

节点可被初始展开或勾选。使用 default-expanded-keysdefault-checked-keys 分别设置初始展开和初始勾选的节点。注意二者均需配合 node-key 使用,其值为数据对象中某字段名,且该字段值需全树唯一。

节点勾选

示例演示如何获取和设置勾选节点。两种途径:按节点对象或按 key。若按 key 操作,必须设置 node-key

自定义节点内容

节点内容可自定义,因此可按需加入图标或按钮。自定义节点内容有两种方式:render-content 与作用域插槽。render-content 接收一个返回节点内容的渲染函数(详见 Vue 渲染函数文档)。若使用作用域插槽,作用域参数含 node(TreeNode 对象)与 data(当前节点数据)。注意 render-content 示例依赖 JSX / h 函数支持。

自定义节点类名

可自定义节点类名。通过 props.class 为节点生成自定义类名。

节点过滤

可对树节点进行过滤。调用 Tree 实例的 filter 方法过滤节点,参数为过滤关键字。注意必须设置 filter-node-method,其值为过滤方法。

手风琴

同一层级每次仅可展开一个节点。

拖拽

为 Tree 加上 draggable 属性即可拖拽节点。

API

Attributes

属性说明类型默认值
data树数据Array<Record<string, any>>[]
empty-text数据为空时显示的文本string暂无数据
node-key每个节点唯一标识的属性名,其值需全树唯一string
props数据字段别名配置,见下表TreeOptionProps见下表
render-after-expand是否在首次展开父节点后才渲染子节点booleantrue
load懒加载子节点数据的方法(仅 lazy 为 true 时生效)(node, resolve, reject) => void
render-content树节点渲染函数(h, { node, data, store }) => VNode | VNode[]
highlight-current是否高亮当前节点booleanfalse
default-expand-all是否默认展开全部节点booleanfalse
expand-on-click-node是否在点击节点时展开/收起;为 false 时仅点击箭头图标才展开/收起booleantrue
check-on-click-node是否在点击节点时勾选/取消勾选;为 false 时仅点击 checkbox 才切换booleanfalse
check-on-click-leaf是否在点击叶子节点时勾选/取消勾选booleantrue
auto-expand-parent展开子节点时是否自动展开父节点booleantrue
default-expanded-keys默认展开的节点 key 数组Array<string | number>
show-checkbox是否显示 checkbox(节点可选)booleanfalse
check-strictly显示 checkbox 时,父子节点是否不联动booleanfalse
check-descendantscheck-strictly 配合,懒加载场景下仅设置子节点勾选态而不向上联动booleanfalse
default-checked-keys默认勾选的节点 key 数组Array<string | number>
current-node-key当前选中节点的 keystring | number
filter-node-method过滤节点的方法(配合 filter 实例方法使用;返回 false 的节点被隐藏)(value, data, node) => boolean
accordion是否每次只展开同级一个节点booleanfalse
indent相邻层级节点的水平缩进(像素)number18
icon自定义树节点图标:IconString(传给 FxIcon)或组件;默认 ep:caret-rightIconString | Component
lazy是否懒加载子节点(配合 loadbooleanfalse
draggable是否开启节点拖拽booleanfalse
allow-drag判断某节点是否可被拖拽(返回 false 则不可拖)(node) => boolean
allow-drop判断拖拽节点是否可放置到目标节点(type: prev 插入目标前 / inner 插入目标内 / next 插入目标后)(draggingNode, dropNode, type) => boolean

props(字段别名)

属性说明类型默认值
label指定作为节点标签的字段string | (data, node) => string
children指定作为子树的字段string
disabled指定节点 checkbox 是否禁用的字段string | (data, node) => boolean
isLeaf指定节点是否为叶子(仅懒加载生效)string | (data, node) => boolean
class自定义节点类名string | (data, node) => string | object

Events

事件名说明参数
node-click点击节点时触发(data, node, nodeInstance, evt)
node-contextmenu右键点击节点时触发(evt, data, node, nodeInstance)
check-change节点勾选状态变化时触发(data, checked, indeterminate)
check点击 checkbox 时触发(data, { checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys })
current-change当前节点变化时触发(data, node)
node-expand节点展开时触发(data, node, nodeInstance)
node-collapse节点收起时触发(data, node, nodeInstance)
node-drag-start拖拽开始时触发(node, evt)
node-drag-enter拖拽进入某节点时触发(draggingNode, dropNode, evt)
node-drag-leave拖拽离开某节点时触发(draggingNode, oldDropNode, evt)
node-drag-over拖拽经过某节点时触发(draggingNode, dropNode, evt)
node-drag-end拖拽结束时触发(draggingNode, dropNode, dropType, evt)dropNode 可能为 nulldropTypebefore / after / inner / none
node-drop拖拽放置完成时触发(draggingNode, dropNode, dropType, evt)

Exposes

名称说明参数
filter过滤所有节点,不匹配的节点被隐藏(value) value 会作为 filter-node-method 的首个参数
updateKeyChildren为节点设置新数据(需 node-key(key, data)
getCheckedNodes返回当前勾选的节点数据数组(leafOnly, includeHalfChecked) 均默认 false;leafOnly=true 仅返回叶子;includeHalfChecked=true 含半选节点
setCheckedNodes勾选指定节点(需 node-key(nodes, leafOnly) 1. 要勾选的节点数组 2. 是否仅作用于叶子(默认 false)
getCheckedKeys返回当前勾选的节点 key 数组(leafOnly) 默认 false;为 true 时仅返回叶子
setCheckedKeys勾选指定 key(需 node-key(keys, leafOnly)
setChecked勾选/取消勾选单个节点(keyOrData, checked, deep) 1. 节点 key 或数据 2. 是否勾选 3. 是否递归子节点(自 2.14.0 起无视 check-strictly 生效)
getHalfCheckedNodes返回半选节点数据数组
getHalfCheckedKeys返回半选节点 key 数组
getCurrentKey返回当前高亮节点的 key(无高亮则 null)
getCurrentNode返回当前高亮节点的数据(无高亮则 null)
setCurrentKey按 key 设置高亮节点(需 node-key(key, shouldAutoExpandParent=true)null 取消高亮
setCurrentNode设置高亮节点(需 node-key(node, shouldAutoExpandParent=true)
getNode按 data 或 key 获取节点(data)
getNodePath返回节点路径(从根到该节点,需 node-key(data)
remove删除节点(需 node-key(data)
append为指定父节点追加子节点(data, parentNode)
insertBefore在指定节点前插入(data, refNode)
insertAfter在指定节点后插入(data, refNode)

Slots

插槽名说明类型
default自定义节点内容{ node: TreeNode, data: TreeNodeData }
empty数据为空时的自定义内容

类型声明

展开声明
ts
type TreeKey = string | number
type TreeNodeData = Record<string, any>
type TreeData = TreeNodeData[]

interface TreeOptionProps {
  children?: string
  label?: string | ((data: TreeNodeData, node: TreeNode) => string)
  disabled?: string | ((data: TreeNodeData, node: TreeNode) => boolean)
  isLeaf?: string | ((data: TreeNodeData, node: TreeNode) => boolean)
  class?:
    | string
    | ((
        data: TreeNodeData,
        node: TreeNode,
      ) => string | { [key: string]: boolean })
}

// TreeNode(通过 ref 访问的节点对象)部分字段:
type TreeNode = {
  canFocus: boolean
  checked: boolean
  childNodes: TreeNode[]
  data: TreeNodeData
  expanded: boolean
  id: number
  indeterminate: boolean
  isCurrent: boolean
  isEffectivelyChecked: boolean
  isLeaf?: boolean
  isLeafByUser?: boolean
  level: number
  loaded: boolean
  loading: boolean
  parent: TreeNode | null
  text: string | null
  visible: boolean
  // 方法:expand / collapse / setChecked / remove 等
}