更新记录
1.0.0(2026-01-29) 下载此版本
组织树组件
平台兼容性
uni-app(4.17)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Chrome插件版本 | Safari | Safari插件版本 | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | √ | 1.0.0 | √ | 1.0.0 | √ | - | - | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
ft-org-tree
OrgTree 组织树形结构组件 API 文档
# OrgTree 组织树形结构组件
一个功能完整的树形结构组件,支持单选/多选、默认展开层级、默认选中、搜索过滤等功能。
## 基础用法
```vue
<template>
<org-tree
:data="treeData"
mode="single"
:default-expand-level="2"
@change="handleChange"
/>
</template>
<script>
import OrgTree from '@/components/org-tree/org-tree.vue'
export default {
components: { OrgTree },
data() {
return {
treeData: [
{
id: '1',
name: '总公司',
children: [
{ id: '1-1', name: '技术部' },
{ id: '1-2', name: '产品部' }
]
}
]
}
},
methods: {
handleChange(nodes) {
console.log('选中的节点:', nodes)
}
}
}
</script>
数据结构
TreeNode 节点数据结构
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | string \| number |
✓ | 节点唯一标识 |
| name | string |
✓ | 节点显示名称 |
| children | TreeNode[] |
- | 子节点数组 |
| disabled | boolean |
- | 是否禁用该节点 |
| isLeaf | boolean |
- | 是否为叶子节点(无子节点时可省略) |
示例:
const treeData = [
{
id: '1',
name: '总公司',
children: [
{
id: '1-1',
name: '技术部',
children: [
{ id: '1-1-1', name: '前端组' },
{ id: '1-1-2', name: '后端组' },
{ id: '1-1-3', name: '测试组', disabled: true }
]
},
{
id: '1-2',
name: '产品部',
isLeaf: true // 标记为叶子节点
}
]
}
]
Props 属性
基础属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| data | Array<TreeNode> |
[] |
树形结构数据源 |
| mode | 'single' \| 'multiple' |
'single' |
选择模式:单选/多选 |
| nodeKey | string |
'id' |
节点唯一标识的字段名 |
| labelKey | string |
'name' |
节点显示文本的字段名 |
| childrenKey | string |
'children' |
子节点的字段名 |
展开控制
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| defaultExpandLevel | number |
1 |
默认展开的层级深度 |
defaultExpandLevel 取值说明:
| 值 | 说明 |
|---|---|
0 |
全部折叠,不展开任何节点 |
1 |
展开第一层(根节点的直接子节点可见) |
2 |
展开到第二层 |
n |
展开到第 n 层 |
-1 |
全部展开,展开所有层级 |
选中控制
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| defaultSelectedIds | Array<string \| number> |
[] |
默认选中的节点ID数组 |
| showCheckbox | boolean |
false |
是否显示复选框(多选模式建议开启) |
| checkStrictly | boolean |
false |
父子节点是否不关联(多选模式有效) |
| onlyLeaf | boolean |
false |
是否只允许选择叶子节点 |
checkStrictly 说明:
false(默认):父子关联,选中父节点会自动选中所有子节点,子节点全选时父节点自动选中true:父子不关联,父节点和子节点的选中状态互不影响
外观配置
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| showLine | boolean |
false |
是否显示连接线 |
| showCount | boolean |
false |
是否显示子节点数量 |
| indent | number |
40 |
节点缩进距离,单位 rpx |
| icon | string |
'' |
节点图标的图片路径 |
| maxHeight | string |
'600rpx' |
树形区域的最大高度 |
功能开关
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| searchable | boolean |
false |
是否显示搜索框 |
| showToolbar | boolean |
false |
是否显示工具栏(展开全部/收起全部等) |
| showSelected | boolean |
false |
是否显示已选中项的标签列表 |
Events 事件
change
选中状态变化时触发(推荐使用)
<org-tree @change="handleChange" />
handleChange(selectedNodes) {
// selectedNodes: Array<TreeNode> - 当前选中的所有节点数组
console.log('选中的节点:', selectedNodes)
}
select
单选模式下选中节点时触发
<org-tree mode="single" @select="handleSelect" />
handleSelect({ node, nodeId, selected, selectedNodes }) {
// node: TreeNode - 当前操作的节点
// nodeId: string | number - 节点ID
// selected: boolean - 是否选中
// selectedNodes: Array<TreeNode> - 当前选中的所有节点
}
check
多选模式下勾选节点时触发
<org-tree mode="multiple" :show-checkbox="true" @check="handleCheck" />
handleCheck({ node, nodeId, checked, checkedNodes }) {
// node: TreeNode - 当前操作的节点
// nodeId: string | number - 节点ID
// checked: boolean - 是否勾选
// checkedNodes: Array<TreeNode> - 当前勾选的所有节点
}
expand
展开或折叠节点时触发
<org-tree @expand="handleExpand" />
handleExpand({ nodeId, expanded, expandedKeys }) {
// nodeId: string | number - 节点ID
// expanded: boolean - 是否展开
// expandedKeys: Array<string | number> - 当前展开的所有节点ID
}
Methods 方法
通过 ref 调用组件方法:
<template>
<org-tree ref="treeRef" :data="treeData" />
<button @click="handleGetSelected">获取选中</button>
</template>
<script>
export default {
methods: {
handleGetSelected() {
const nodes = this.$refs.treeRef.getSelectedNodes()
console.log(nodes)
}
}
}
</script>
获取数据
| 方法名 | 返回值 | 说明 |
|---|---|---|
| getSelectedNodes() | Array<TreeNode> |
获取选中的节点数组 |
| getSelectedKeys() | Array<string \| number> |
获取选中的节点ID数组 |
| getIndeterminateKeys() | Array<string \| number> |
获取半选状态的节点ID数组(多选模式) |
设置数据
| 方法名 | 参数 | 说明 |
|---|---|---|
| setSelectedKeys(keys) | keys: Array<string \| number> |
设置选中的节点 |
展开控制
| 方法名 | 参数 | 说明 |
|---|---|---|
| expandAll() | - | 展开全部节点 |
| collapseAll() | - | 折叠全部节点 |
| expandNode(nodeId) | nodeId: string \| number |
展开指定节点 |
| collapseNode(nodeId) | nodeId: string \| number |
折叠指定节点 |
其他
| 方法名 | 参数 | 说明 |
|---|---|---|
| scrollToNode(nodeId) | nodeId: string \| number |
定位并高亮指定节点 |
使用示例
示例1:单选模式
<template>
<org-tree
:data="treeData"
mode="single"
:default-expand-level="2"
:default-selected-ids="['1-1']"
:searchable="true"
@change="handleChange"
/>
</template>
<script>
export default {
methods: {
handleChange(nodes) {
if (nodes.length > 0) {
console.log('选中:', nodes[0].name)
}
}
}
}
</script>
示例2:多选模式(父子关联)
<template>
<org-tree
:data="treeData"
mode="multiple"
:show-checkbox="true"
:check-strictly="false"
:default-selected-ids="['1-1-1', '1-1-2']"
:show-selected="true"
:show-toolbar="true"
@change="handleChange"
/>
</template>
<script>
export default {
methods: {
handleChange(nodes) {
console.log('选中数量:', nodes.length)
console.log('选中节点:', nodes.map(n => n.name))
}
}
}
</script>
示例3:多选模式(父子不关联)
<template>
<org-tree
:data="treeData"
mode="multiple"
:show-checkbox="true"
:check-strictly="true"
:default-expand-level="-1"
@change="handleChange"
/>
</template>
示例4:只选择叶子节点
<template>
<org-tree
:data="treeData"
mode="multiple"
:show-checkbox="true"
:only-leaf="true"
@change="handleChange"
/>
</template>
示例5:自定义字段名
<template>
<org-tree
:data="customData"
node-key="orgId"
label-key="orgName"
children-key="subOrgs"
@change="handleChange"
/>
</template>
<script>
export default {
data() {
return {
customData: [
{
orgId: '1',
orgName: '总公司',
subOrgs: [
{ orgId: '1-1', orgName: '技术部' }
]
}
]
}
}
}
</script>
示例6:通过 ref 控制组件
<template>
<org-tree ref="treeRef" :data="treeData" mode="multiple" :show-checkbox="true" />
<view class="actions">
<button @click="getSelected">获取选中</button>
<button @click="setSelected">设置选中</button>
<button @click="expandAll">展开全部</button>
<button @click="collapseAll">折叠全部</button>
</view>
</template>
<script>
export default {
methods: {
getSelected() {
const nodes = this.$refs.treeRef.getSelectedNodes()
const keys = this.$refs.treeRef.getSelectedKeys()
console.log('选中节点:', nodes)
console.log('选中ID:', keys)
},
setSelected() {
this.$refs.treeRef.setSelectedKeys(['1-1', '1-2'])
},
expandAll() {
this.$refs.treeRef.expandAll()
},
collapseAll() {
this.$refs.treeRef.collapseAll()
}
}
}
</script>
插槽 Slots
暂不支持自定义插槽,如需自定义节点内容,请修改 org-tree-node.vue 组件。
注意事项
-
节点ID唯一性:确保每个节点的
id(或自定义 nodeKey)在整棵树中唯一 -
禁用节点:设置
disabled: true的节点不可选中,但可以展开/折叠 -
性能考虑:数据量较大时(>1000节点),建议:
- 设置合理的
defaultExpandLevel,避免初始全部展开 - 关闭
showCount,减少计算开销
- 设置合理的
-
多选模式:建议同时设置
showCheckbox: true,提供更好的交互体验 -
搜索功能:搜索时会自动展开匹配节点的父级路径,并高亮第一个匹配项
更新日志
v1.0.0
- 🎉 初始版本发布
- ✨ 支持单选/多选模式
- ✨ 支持默认展开层级配置
- ✨ 支持默认选中节点
- ✨ 支持父子节点关联/不关联
- ✨ 支持搜索过滤
- ✨ 支持只选择叶子节点
- ✨ 支持工具栏和已选中项展示
文件下载
将上述内容保存为 org-tree-api.md 文件即可。

收藏人数:
下载插件并导入HBuilderX
下载示例项目ZIP
赞赏(0)
下载 3821
赞赏 0
下载 11196497
赞赏 1854
赞赏
京公网安备:11010802035340号