更新记录

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 组件。


注意事项

  1. 节点ID唯一性:确保每个节点的 id(或自定义 nodeKey)在整棵树中唯一

  2. 禁用节点:设置 disabled: true 的节点不可选中,但可以展开/折叠

  3. 性能考虑:数据量较大时(>1000节点),建议:

    • 设置合理的 defaultExpandLevel,避免初始全部展开
    • 关闭 showCount,减少计算开销
  4. 多选模式:建议同时设置 showCheckbox: true,提供更好的交互体验

  5. 搜索功能:搜索时会自动展开匹配节点的父级路径,并高亮第一个匹配项


更新日志

v1.0.0

  • 🎉 初始版本发布
  • ✨ 支持单选/多选模式
  • ✨ 支持默认展开层级配置
  • ✨ 支持默认选中节点
  • ✨ 支持父子节点关联/不关联
  • ✨ 支持搜索过滤
  • ✨ 支持只选择叶子节点
  • ✨ 支持工具栏和已选中项展示

文件下载

将上述内容保存为 org-tree-api.md 文件即可。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。