React 中使用 react-org-tree 实现组织结构树

React 中使用 react-org-tree 实现组织结构树

引言

在企业管理系统中,组织结构树是一个非常常见的功能需求。本文将详细介绍如何在 React 项目中使用 react-org-tree 组件来实现组织结构树的展示和交互。

安装依赖

首先,我们需要安装 react-org-tree 包:

bash 复制代码
npm install react-org-tree --save

或者使用 yarn:

bash 复制代码
yarn add react-org-tree

基本使用示例

数据准备

组织结构树需要特定格式的数据。通常后端返回的数据是扁平化的数组,我们需要将其转换为树形结构:

typescript 复制代码
// 工具函数:将扁平化数组转换为树形结构
export function filterArray(arr: any[], pid = 'parentId', id = 'id', children = 'children') {
  const obj: Record<string, any> = Object.create(null)
  const tree_arr: any[] = []
  
  arr.forEach(res => {
    obj[res[id]] = res
  })
  
  arr.map(res => {
    const parent = obj[res[pid]]
    if (parent) {
      if (!parent[children]) {
        parent[children] = []
      }
      parent[children].push(res)
    } else {
      tree_arr.push(res)
    }
  })
  
  return tree_arr
}

组件实现

tsx 复制代码
import React, { useState, useEffect } from "react";
import OrgTree from "react-org-tree";
import "./index.css";

export default function CompanyOrgChart() {
  const [treeData, setTreeData] = useState<any[]>([]);

  const handleClick = (e: any, nodeData: any) => {
    console.log("节点点击:", nodeData);
    // 处理节点点击逻辑
  };

  useEffect(() => {
    // 模拟从 API 获取数据
    const mockData = [
      { id: 1, name: '总公司', parentId: 0 },
      { id: 2, name: '分公司A', parentId: 1 },
      { id: 3, name: '分公司B', parentId: 1 },
      { id: 4, name: '部门A1', parentId: 2 },
      { id: 5, name: '部门A2', parentId: 2 },
    ];

    // 转换为树形结构
    const companyData = mockData.map(item => ({
      ...item,
      label: item.name,
      key: item.id
    }));

    setTreeData(filterArray(companyData));
  }, []);

  return (
    <div className="org-chart-container">
      {treeData.length > 0 &&
        treeData.map((item: any) => (
          <OrgTree
            key={item.key}
            data={item}
            horizontal={true}  // 水平布局
            collapsable={true}  // 可折叠
            expandAll={true}  // 默认展开所有节点
            onClick={handleClick}  // 点击事件
            labelWidth={249}  // 节点宽度
            labelClassName="org-node-label"  // 自定义样式类
          />
        ))}
    </div>
  );
}

关键属性说明

参数(prop) 说明(descripton) 类型(type) 默认值(default)
data 树结构数据 Object {}
horizontal 是否横向 Boolean false
collapsable 是否可折叠 Boolean false
expandAll 是否展开全部 Boolean false
labelWidth 树节点宽度 Number auto
labelClassName 树节点样式 String white
onClick 点击事件 Function(e:Event, data)

样式自定义

创建 index.css 文件来自定义节点样式:

css 复制代码
.org-chart-container {
  padding: 20px;
  background: #f5f5f5;
  min-height: 400px;
}

.org-node-label {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 12px 16px;
  background: #fff;
  border: 1px solid #d9d9d9;
  border-radius: 4px;
  cursor: pointer;
  transition: all 0.3s;
}

.org-node-label:hover {
  background: #e6f7ff;
  border-color: #91d5ff;
}

常见问题

Q1: 数据格式不正确导致树形不显示

原因react-org-tree 需要特定的数据格式,必须包含 labelkey 字段,子节点需要放在 children 数组中。

解决 :确保数据转换正确,使用 filterArray 工具函数将扁平化数据转换为树形结构。

Q2: 节点点击事件不触发

原因onClick 属性需要传入正确的回调函数。

解决:确保传入的是函数引用,而非函数调用。

Q3: 样式不生效

原因:CSS 文件未正确导入或样式选择器不正确。

解决:确保导入了 CSS 文件,并使用正确的样式类名。

总结

react-org-tree 是一个轻量级的组织结构树组件,使用简单,配置灵活。通过本文的介绍,相信你已经掌握了在 React项目中使用 react-org-tree 的基本方法和技巧。

如果你有任何问题或建议,欢迎在评论区留言讨论!

相关推荐
MariaH1 小时前
费曼学习法与effort-learning理论
前端
qiaofugui1 小时前
如何用 Codex 做一次可靠的项目重构:方法、节奏和可复用提示词
前端
涛涛ing1 小时前
前端圈7月大地震:TS 7发布、Bun 11天从Zig迁Rust、Kimi K3登顶、大厂裁员50%
前端
遇乐的果园1 小时前
前端学习笔记-vue列表处理
前端·vue.js·学习
倾颜1 小时前
AI 聊天刷新后记录全丢?用浏览器本地存储给 AI Chat 加一层"离线记忆"
前端·aigc
梦想的旅途21 小时前
企业微信API 实现企业微信消息的自动发送?
java·服务器·前端
何时梦醒1 小时前
🤖 RAG 文档分割器(Splitter)深度学习笔记 —— 从零搭建知识库文档处理流水线
前端·javascript·人工智能
ss2732 小时前
Vue 完整版本发展史时间线(2013–2026)|版本迭代里程碑+核心特性对照表
前端·javascript·vue.js