Tree 树形控件

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

基础用法

基础树结构。

可选择

用于节点选择。

本示例同时演示如何异步加载节点数据。

WARNING

使用 show-checkbox 时,由于 check-on-click-leaf 默认为 true, 点击末级子节点可选中对应复选框。

懒加载下的叶子节点

节点数据在点击前不会加载,因此树无法预知是否为叶子节点,故每个节点会显示下拉按钮;点击后若为叶子节点则下拉按钮消失。你也可以预先告知树该节点是否为叶子节点,从而在叶子节点渲染前避免显示下拉按钮。

多次懒加载

远程懒加载可能失败,此时可调用 reject 保持节点状态并允许继续远程加载。

禁用复选框

可将节点复选框设为禁用。

示例在 defaultProps 中声明 disabled 属性,部分节点设置 disabled: true,对应复选框禁用且不可点击。

默认展开与默认选中

节点可设置初始展开或选中。

使用 default-expanded-keysdefault-checked-keys 分别设置初始展开与初始选中节点。二者生效需要 node-key,其值为数据对象中的字段名,且该字段在整棵树中唯一。

Level one 2
Level one 3

勾选树节点

演示如何获取与设置勾选节点,支持按节点对象或 key 两种方式;若使用 key 方式,需要配置 node-key

Level one 1
Level two 1-1
Level three 1-1-1
Level three 1-1-2
Level one 2
Level two 2-1
Level two 2-2
Level one 3
Level two 3-1
Level two 3-2

自定义节点内容

可自定义节点内容,例如添加图标或按钮。

两种方式:render-content 与作用域插槽。render-content 接收渲染函数并返回节点内容,详见 Vue 文档。作用域插槽可访问 nodedata,分别表示当前 TreeNode 与节点数据。注意:render-content 示例无法在 JSFiddle 运行(不支持 JSX);真实项目配置依赖后可正常使用。

Using render-content

Level one 1
Level two 1-1
Level three 1-1-1
Level three 1-1-2
Level one 2
Level two 2-1
Level two 2-2
Level one 3
Level two 3-1
Level two 3-2

Using scoped slot

Level one 1
Level two 1-1
Level three 1-1-1
Level three 1-1-2
Level one 2
Level two 2-1
Level two 2-2
Level one 3
Level two 3-1
Level two 3-2

自定义节点类名

可自定义节点类名。

使用 props.class 构建节点类名。

Level one 1
Level two 1-1
Level three 1-1-1
Level three 1-1-2
Level one 2
Level two 2-1
Level two 2-2
Level one 3
Level two 3-1
Level two 3-2

树节点过滤

可对树节点进行过滤。

调用树实例的 filter 方法并传入关键字;需要同时配置 filter-node-method 作为过滤函数。

Level one 1
Level two 1-1
Level three 1-1-1
Level three 1-1-2
Level one 2
Level two 2-1
Level two 2-2
Level one 3
Level two 3-1
Level two 3-2

手风琴模式

同级仅允许展开一个节点。

可拖拽

添加 draggable 属性可拖拽节点。

Level one 1
Level two 1-1
Level three 1-1-1
Level one 2
Level two 2-1
Level three 2-1-1
Level two 2-2
Level three 2-2-1
Level one 3
Level two 3-1
Level three 3-1-1
Level two 3-2
Level three 3-2-1

树形控件 API

属性

名称说明类型默认值
data展示数据array
empty-text内容为空时展示的文本string
node-key每个树节点用来作为唯一标识的属性,整棵树中应唯一string
props配置选项,见下表object
render-after-expand是否在第一次展开父节点后才渲染子节点booleantrue
load加载子树数据的方法,仅当 lazy 为 true 时生效Function
render-content树节点的渲染函数Function
highlight-current是否高亮当前选中节点booleanfalse
default-expand-all是否默认展开所有节点booleanfalse
expand-on-click-node是否在点击节点时展开/收起;为 false 时仅点击箭头图标才会展开/收起booleantrue
check-on-click-node是否在点击节点时选中/取消;为 false 时仅点击复选框才会切换选中状态booleanfalse
check-on-click-leaf是否在点击叶子节点(末级)时切换选中状态booleantrue
auto-expand-parent展开子节点时是否自动展开父节点booleantrue
default-expanded-keys默认展开的节点 key 数组array
show-checkbox节点是否可被选择(显示复选框)booleanfalse
check-strictly在显示复选框时,是否严格的遵循父子不互相关联booleanfalse
default-checked-keys默认勾选的节点 key 数组array
current-node-key当前选中节点的 keystring / number
filter-node-method对树节点进行筛选时执行的方法,返回 false 表示隐藏该节点Function
accordion是否每次只打开一个同级树节点展开booleanfalse
indent相邻级节点间的水平缩进,单位为像素number18
icon自定义树节点图标组件string / Component
lazy是否懒加载子节点,需与 load 方法结合使用booleanfalse
draggable是否开启拖拽节点功能booleanfalse
allow-drag判断节点能否被拖拽;若返回 false,节点不能被拖拽Function
allow-drop拖拽时判定目标节点能否被放置。若返回 false,拖拽节点不能被放置到目标节点。type 有三种取值:prev(插入目标节点前)、inner(插入至目标节点内)、next(插入目标节点后)Function

props

属性说明类型默认值
label指定节点标签为节点对象的某个属性值,或返回字符串的函数string / Function
children指定子树为节点对象的某个属性值string
disabled指定节点选择框是否禁用为节点对象的某个属性值或返回布尔值的函数string / Function
isLeaf指定节点是否为叶子节点,仅在懒加载时有效string / Function
class自定义节点类名string / Function

暴露

Tree 提供以下方法(与当前选中节点数组等相关)。

方法说明参数
filter过滤所有树节点;被过滤的节点将被隐藏一个参数,会作为 filter-node-method 的第一个入参
updateKeyChildren为节点设置新数据,仅在设置了 node-key 时生效(key, data) 两个参数:1. 节点 key 2. 新数据
getCheckedNodes若节点可被选择(show-checkboxtrue),返回目前被选中的节点所组成的数组(leafOnly, includeHalfChecked) 两个布尔参数:1. 默认 false;为 true 时仅返回叶子节点中被选中的节点 2. 默认 false;为 true 时返回值包含半选节点
setCheckedNodes设置目前勾选的节点,仅在使用 node-key 时生效(nodes, leafOnly) 两个参数:1. 待勾选节点的对象数组 2. 布尔值,为 true 时仅设置叶子节点的选中状态,默认 false
getCheckedKeys若节点可被选择(show-checkboxtrue),返回目前选中节点的 key 所组成的数组(leafOnly) 布尔参数,默认 false;为 true 时仅返回叶子节点的选中 key
setCheckedKeys通过 key 设置目前勾选的节点,仅在使用 node-key 时生效(keys, leafOnly) 两个参数:1. 待勾选节点的 key 数组 2. 布尔值,为 true 时仅设置叶子节点选中状态,默认 false
setChecked通过 key 或 data 设置节点勾选状态,仅在使用 node-key 时生效(key/data, checked, deep) 三个参数:1. 待勾选节点的 key 或 data 2. 是否选中 3. 是否深度选中(要求 check-strictlyfalse
getHalfCheckedNodes若节点可被选择(show-checkboxtrue),返回半选节点组成的数组
getHalfCheckedKeys若节点可被选择(show-checkboxtrue),返回目前半选节点的 key 所组成的数组
getCurrentKey获取当前被选中节点的 key,若没有则返回 null
getCurrentNode获取当前被选中节点的 data,若没有则返回 null
setCurrentKey通过 key 设置当前高亮节点,仅在使用 node-key 时生效(key, shouldAutoExpandParent=true) 1. 待高亮节点的 key,null 表示取消高亮 2. 是否自动展开父节点
setCurrentNode通过 node 设置当前高亮节点,仅在使用 node-key 时生效(node, shouldAutoExpandParent=true) 1. 待高亮节点 2. 是否自动展开父节点
getNode根据 data 或 key 获取 Tree 中的 node(data) 节点的 data 或 key
remove删除节点,仅在使用 node-key 时生效(data) 要删除节点的 data 或 node
append为指定节点追加子节点(data, parentNode) 1. 要追加的子节点 data 2. 父节点的 data、key 或 node
insertBefore在指定节点前插入节点(data, refNode) 1. 要插入的节点 data 2. 参考节点的 data、key 或 node
insertAfter在指定节点后插入节点(data, refNode) 1. 要插入的节点 data 2. 参考节点的 data、key 或 node

事件

名称说明参数
node-click节点被点击时触发四个参数:对应节点的节点对象、TreeNode 的 node 属性、TreeNode 自身、原生事件对象
node-contextmenu节点上点击鼠标右键时触发四个参数:事件对象、对应节点的节点对象、TreeNode 的 node 属性、TreeNode 自身
check-change节点选中状态发生变化时触发三个参数:状态发生变化的节点对象、是否选中、子树是否有选中节点
check点击节点复选框后触发两个参数:勾选/取消勾选的节点对象、树目前的勾选状态对象(含 checkedNodescheckedKeyshalfCheckedNodeshalfCheckedKeys
current-change当前选中节点变化时触发两个参数:当前选中节点的节点对象、TreeNode 的 node 属性
node-expand节点展开时触发三个参数:被展开节点的节点对象、TreeNode 的 node 属性、TreeNode 自身
node-collapse节点收起时触发三个参数:被收起节点的节点对象、TreeNode 的 node 属性、TreeNode 自身
node-drag-start节点开始拖拽时触发两个参数:被拖拽节点对应的对象、事件对象
node-drag-enter拖拽进入其他节点时触发三个参数:被拖拽节点对象、进入的节点对象、事件对象
node-drag-leave拖拽离开节点时触发三个参数:被拖拽节点对象、离开的节点对象、事件对象
node-drag-over在节点上拖拽经过时触发(类似 mouseover)三个参数:被拖拽节点对象、经过的节点对象、事件对象
node-drag-end拖拽结束时触发四个参数:被拖拽节点对象、拖拽结束位置节点对象(可能为 undefined)、放置类型(before / after / inner)、事件对象
node-drop拖拽成功放置后触发四个参数:被拖拽节点对象、目标节点对象、放置类型(before / after / inner)、事件对象

插槽

名称说明类型
default自定义树节点内容object
empty数据为空时的展示内容

类型声明

显示类型声明
ts
interface RootTreeType {
  root: Ref<Node>
  // ...
}

// UnwrapRef<RootTreeType['root']> => Node
type Node = {
  canFocus: boolean
  checked: boolean
  childNodes: Node[]
  data: TreeNodeData
  expanded: boolean
  id: number
  indeterminate: boolean
  isCurrent: boolean
  isEffectivelyChecked: boolean
  isLeaf?: boolean
  isLeafByUser?: boolean
  level: number
  loaded: boolean
  loading: boolean
  parent: Node | null
  store: TreeStore
  text: string | null
  visible: boolean
}

// TreeNodeData => Tree / TreeOptionProps
// Tree type is your prop type.
// TreeOptionProps is default prop type
interface TreeOptionProps {
  children?: string
  label?: string | ((data: TreeNodeData, node: Node) => string)
  disabled?: string | ((data: TreeNodeData, node: Node) => boolean)
  isLeaf?: string | ((data: TreeNodeData, node: Node) => boolean)
  class?: (
    data: TreeNodeData,
    node: Node
  ) => string | { [key: string]: boolean }
}