想用react实现一个递归树,但一些框架里面的有些不符合需求,于是自己写了个,功能比较简单,欢迎批评指正。。

react实现这样一个组织架构递归树,下级部门的收起和展开,点击部门名称时请求接口获取下级部门以及员工等。效果如下:

首先封装左边的组织架构组件organize-tree

import React, { Component } from 'react';
export default class OrganizeTree extends React.Component { render(){
let self = this;
return (
<div className="OrganizeTree">
<div className="left">
{
this.props.treedata.map(function(item,index){
return <div className="row-li" key={index}>
<span className={`${item.show?'':'rotate90'}`}>
<i className={`iconfont arrow ${item.departs?'icon-arrowdropdown':''}`} onClick={self.toggle.bind(self,item,index)}></i>
</span>
<span className={`depart ${item.departs?'':'departmentname'}`} onClick={self.showdepart.bind(self,item,index)}>{item.departmentName}</span>
{
item.departs&&item.show?<OrganizeTree treedata={item.departs} toggleTree={self.toggle.bind(self,item.departs)} showDepart={self.showdepart.bind(self,item.departs)}/>:''
}
</div>
})
}
</div>
</div>
)
} toggle(item,index){ // 点击左侧切换符号切换展开收起
if(typeof index === 'number'){
this.props.toggleTree(item)
}else{
this.props.toggleTree(index)
}
} showdepart(item,index){
if(typeof index === 'number'){
this.props.showDepart(item)
}else{
this.props.showDepart(index)
} } }

样式tree.less

.Organization{ // 组织架构树组件
.left-tree{width: 200px;background: #fff;margin: 15px 0 15px 15px;min-height: 700px;
.search-wrapper{padding:20px 10px;position:relative;
.search{font-size: 12px;height: 30px;padding-left: 25px;width: 100%;line-height: 30px;border:1px solid #d8d8d8;}
.icon-sousuo{position: absolute;top: 25px;left: 15px;z-index:;color: #d8d8d8;}
}
.row-li{text-align: left;font-size: 12px;line-height: 35px;
.arrow{font-size: 30px;}
.departmentname{padding-left: 16px;}
.depart{cursor: pointer;}
.icon-arrow-right{font-size: 24px;}
}
}
.right-con{width: 100%;
.title{margin: 10px 0;
.iconfont{margin-right: 10px;}
}
.bt1p{border-bottom: 1px solid #d8d8d8;padding-bottom: 10px;}
}
}
.OrganizeTree{padding-left: 15px;}

页面引用该组件 organization.jsx

import React, { Component } from 'react';
import InterfaceServer from '@/axios/interface'
const interfaceServer = new InterfaceServer();
import OrganizeTree from '@/components/organize-tree'
import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import * as infoActions from '@/store/userinfo/action'
import store from '@/store/store'
import './tree.less' class Organization extends React.Component { constructor(props,context){
super(props,context)
this.state = {
treedata:[],
}
} render(){
let s = store.getState().organizeInfo
return(
<div className="Organization">
<div className="nav col666"><span>组织架构</span></div>
<div className="flex">
            <!--左边的组织架构树-->
<div className="left-tree">
<div className="search-wrapper">
<input type="text" className="input search" placeholder="请输入部门名称"/>
<i className="iconfont icon-sousuo"></i>
</div>
<OrganizeTree treedata={this.state.treedata} toggleTree={this.toggleTree.bind(this)} showDepart={this.showDepart.bind(this)}/>
</div>
            <!--右边的详情-->
<div className="right-con bgcon txtleft">
<div className="title"><i className="iconfont icon-zuzhi"></i>才华有限公司 <button className="btn">编辑</button></div>
<div className="title bt1p"><i className="iconfont icon-bumen"></i>下级部门 <button className="btn">增加</button></div>
{
s.department&&s.department.length?
<table className="table" border="0" cellPadding="0" cellSpacing="0" bordercolor="#eee">
<thead>
<tr>
<th>部门名称</th>
<th>部门主管</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{
s.department.map(function(item,index){
return <tr key={index}>
<td>{item.departmentName}</td>
<td>{item.supervisor}</td>
<td><a className="linka">编辑</a><a className="linka">删除</a></td>
</tr>
})
}
</tbody>
</table>
:<div>暂无下级部门</div>
}
<div className="title bt1p"><i className="iconfont icon-bumen1"></i>部门员工 <button className="btn">增加</button></div>
{
s.employees&&s.employees.length?
<table className="table" border="0" cellPadding="0" cellSpacing="0" bordercolor="#eee">
<thead>
<tr>
<th>姓名</th>
<th>职位名称</th>
<th>联系电话</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{
s.employees.map(function(item,index){
return <tr key={index}>
<td>{item.emName}</td>
<td>{item.poName}</td>
<td>{item.emPhone}</td>
<td><a className="linka">编辑</a><a className="linka">删除</a></td>
</tr>
})
}
</tbody>
</table>
:<div>暂无下级部门</div>
}
</div>
</div>
</div>
)
} componentWillMount(){
this._sendOrganizationServer()
console.log(store.getState().organizeInfo);
let organizeInfo = store.getState().organizeInfo
this._sendShowemployeeServer({departmentName:'才华有限公司'}) } _sendOrganizationServer(){
interfaceServer.sendOrganizationServer({
onSuccess:res=>{
console.log(res);
let result = res.data
result.forEach(item=>{
item.show = true;
if(item.departs){
item.departs.forEach(i=>{
i.show = true
})
}
})
this.setState({
treedata:result
}) }
})
} _sendShowemployeeServer(param){
interfaceServer.sendShowemployeeServer({
data:param,
onSuccess:res=>{
console.log(res);
// 保存到redux里
this.props.organizeInfoActions.saveOrganizeINFO(res.data)
}
})
} toggleTree(item,index){
item.show = !item.show;
this.setState({
treedata:this.state.treedata
})
} showDepart(item){
console.log(item);
this._sendShowemployeeServer({departmentName:item.departmentName})
}
} function mapStateToProps(state){
return {
organizeInfo: state.organizeInfo
}
} function mapDispatchToProps(dispatch){
return {
organizeInfoActions: bindActionCreators(infoActions, dispatch)
}
} export default connect(
mapStateToProps,
mapDispatchToProps
)(Organization)

更多详细代码见 https://github.com/leitingting08/react-app/tree/master/src/components/organize-tree

react封装组织架构递归树的更多相关文章

  1. Android一个炫酷的树状图组织架构图开源控件实现过程

    Android一个炫酷的树状图组织架构图开源控件 文章目录 [1 简介] [2 效果展示] [3 使用步骤] [4 实现基本布局流程] [5 实现自由放缩及拖动] [6 实现添加删除及节点动画] [7 ...

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(41)-组织架构

    系列目录 本节开始我们要实现工作流,此工作流可以和之前的所有章节脱离关系,也可以紧密合并. 我们当初设计的项目解决方案就是可伸缩可以拆离,可共享的项目解决方案.所以我们同时要添加App.Flow文件夹 ...

  3. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(41)-组织架构

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(41)-组织架构 本节开始我们要实现工作流,此工作流可以和之前的所有章节脱离关系,也可以紧密合并. 我们当 ...

  4. NetBpm 组织架构(4)

    大牛的杰作,赞一个 转自:NetBPM工作流的架构设计及实现浅析 读前的话:由于本文涉及内容颇多,若有地方读来不很明白,建议先跳过,整体上有个认识后,再回过头来理解.作者认识有限,若有错误,欢迎斧正: ...

  5. 使用jOrgChart插件实现组织架构图的展示

    项目要做组织架构图,要把它做成自上而下的树形结构. 一.说明 (1)通过后台查询数据库,生成树形数组结构,返回到前台. (2)需要引入的js插件和css文件: ①jquery.jOrgChart.cs ...

  6. js前端使用jOrgChart插件实现组织架构图的展示

    项目要做组织架构图,要把它做成自上而下的树形结构. 需要购买阿里云产品的,可以点击此链接购买,有红包优惠哦: https://promotion.aliyun.com/ntms/yunparter/i ...

  7. vue2-org-tree 基于VUE的部门组织架构组件,增删节点实现

    本文所用组件传送门:vue-org-tree 本文基于antd (其他前端组件框架操作基本都类似的: iview,elementui,boostrap-vue...) 当然,github上还有其他类似 ...

  8. 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相信相信的力量! 从懵懂的少年,到拿起键盘,可以写一个Hell ...

  9. Atittit.研发公司的组织架构与部门架构总结

    Atittit.研发公司的组织架构与部门架构总结 1. archi组织架构与 部门规划2 1.1. 最高五大组织机构2 1.2. 宗教事务部2 1.3. 制度与重大会议委员会2 1.4. 纠纷处理部: ...

随机推荐

  1. Thinkphp 模板中使用自定义函数的方法

    1.number_format {$number|number_format=2}   千分位,保留两位小数 2.round {$number|round=2}   四舍五入保留两位小数

  2. python Thread对象的setDaemon(True)的作用。

    1.如果主线程是永远都不会结束的,那设置一个线程为守护线程是没必要的,设不设置都一样. 2.什么时候需要设置为守护线程?如果希望子线程一直运行,可以把子线程的代码写在while True里面一直循环, ...

  3. python2和3的区别,怎么样做到轻松切换2和3

    以下是菜鸟教程列举的.这些零散的改变需要注意. 下面这些东西可能平时的程序根本没用到,或者稍加注意就可以了.但2和3最主要的区别是,掌握编码. 编码在所有程序中无处不在,处理不好,要么乱码,要么编码解 ...

  4. git同时提交到两个仓库

    有时候一个项目,希望既提交到oschina又提交到公司内网的gitlab,或者是github什么的. 使用git remote -v 查看当前git的远程仓库. 添加一个远程仓库 git remote ...

  5. SQLServer------远程调用失败

    1.情况 出现 2.解决方法 打开“控制面板” -> “卸载程序” -> 找到 “Microsoft SQL Server 2016) ExpressLocalDB”将其卸载 -> ...

  6. 5 -- Hibernate的基本用法 --1 4 Hibernate概述

    Hibernate 不仅仅管理Java类到数据库的映射(包括Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间.

  7. 一张图了解SSH端口转发

    ssh和端口转发什么的,我就不想废话了,主要是ssh的命令格式真心不太好理解.网上也搜过相关文章,参差不齐.其实自己也理解怎么用,但我自己也表达不好.这几日无意碰到篇好文章,有图有真相,清楚的很,还有 ...

  8. 【安全开发】C/C++安全编码规范

    C本质上是不安全的编程语言.例如如果不谨慎使用的话,其大多数标准的字符串库函数有可能被用来进行缓冲区攻击或者格式字符串攻击.但是,由于其灵活性.快速和相对容易掌握,它是一个广泛使用的编程语言.下面是针 ...

  9. [XPath] XPath 与 lxml (三)XPath 坐标轴

    本章我们将沿用上一章的 XML 示例文档. XPath 坐标轴 坐标轴用于定义当对当前节点的节点集合. 坐标轴名称 含义 ancestor 选取当前节点的所有先辈元素及根节点. ancestor-or ...

  10. eclipse项目中.classpath文件详解

    1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...