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 需要特定的数据格式,必须包含 label 和 key 字段,子节点需要放在 children 数组中。

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

Q2: 节点点击事件不触发

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

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

Q3: 样式不生效

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

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

总结

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

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

相关推荐
恋猫de小郭10 分钟前
Flutter + EmbeddingGemma 2,谷歌发布完全端侧的 AI Edge Foresight
android·前端·flutter
FITA阿泽要努力16 分钟前
第1周·第2讲|一道综合代码推演
服务器·前端·python·agent.
iCxhust17 分钟前
如何批量导出edge保存的密码
前端·windows·edge
JarvanMo19 分钟前
写 Flutter 不用再套六层 Widget 了
前端
小羊没烦恼!26 分钟前
关于大型asp.net应用系统的架构-架构的选择
java·服务器·开发语言·前端·c#
GISer_Jing32 分钟前
height、line-height、font-size相同字体遮挡问题
前端·ai
字节渡客37 分钟前
接口参数偶尔丢失、乱码、解析失败,不是前端传参问题
前端
夏幻灵38 分钟前
前端八股:JavaScript 深拷贝详解:实现方式、递归原理与循环引用
开发语言·前端·javascript
@#¥&~是乱码鱼啦1 小时前
ArkWeb开发手记01|Web 组件 H5 加载与生命周期管理
前端
suaizai_1 小时前
ComputerUse:让AI真正操控桌面系统
java·前端·javascript