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 的基本方法和技巧。

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

相关推荐
雪隐几秒前
WPF + MVVM 实战系列02-告别 INPC 手写时代,做个体面的现代 WPF 人
前端·后端·c#
肉肉不吃 肉5 分钟前
无渲染组件和组合式函数
前端·javascript·vue.js
码云之上9 分钟前
Loop Engineering:把模型调用变成可控的多步任务
人工智能·前端框架·前端工程化
未来智慧谷9 分钟前
从 Atlas 关停复盘:AI 应用的三种载体形态怎么选(独立应用 / 浏览器扩展 / 桌面宿主)
前端·人工智能·ai·架构·浏览器
sugar__salt14 分钟前
前端路由技术详解:从传统多页到 React SPA 的完整进化之路
前端·javascript·react.js·前端框架
Canace30 分钟前
Harness Engineering 到底在做什么
前端·人工智能·ai编程
用户842981424181032 分钟前
JS代码压缩实测:可减小体积、提高执行效率!
前端·javascript·后端
snow@li35 分钟前
Vue Axios封装与SpringBoot Payload封装全景关联分析(前后端数据交互底层闭环)
前端·vue.js·spring boot
Csvn38 分钟前
🐛 React StrictMode 下 useEffect 执行两次:不是 Bug,是特性
前端
用户2930750976691 小时前
React Hooks 与前端编程模型:从 DOM 操作到 Web Worker
react.js