react封装组织架构递归树
想用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封装组织架构递归树的更多相关文章
- Android一个炫酷的树状图组织架构图开源控件实现过程
Android一个炫酷的树状图组织架构图开源控件 文章目录 [1 简介] [2 效果展示] [3 使用步骤] [4 实现基本布局流程] [5 实现自由放缩及拖动] [6 实现添加删除及节点动画] [7 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(41)-组织架构
系列目录 本节开始我们要实现工作流,此工作流可以和之前的所有章节脱离关系,也可以紧密合并. 我们当初设计的项目解决方案就是可伸缩可以拆离,可共享的项目解决方案.所以我们同时要添加App.Flow文件夹 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(41)-组织架构
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(41)-组织架构 本节开始我们要实现工作流,此工作流可以和之前的所有章节脱离关系,也可以紧密合并. 我们当 ...
- NetBpm 组织架构(4)
大牛的杰作,赞一个 转自:NetBPM工作流的架构设计及实现浅析 读前的话:由于本文涉及内容颇多,若有地方读来不很明白,建议先跳过,整体上有个认识后,再回过头来理解.作者认识有限,若有错误,欢迎斧正: ...
- 使用jOrgChart插件实现组织架构图的展示
项目要做组织架构图,要把它做成自上而下的树形结构. 一.说明 (1)通过后台查询数据库,生成树形数组结构,返回到前台. (2)需要引入的js插件和css文件: ①jquery.jOrgChart.cs ...
- js前端使用jOrgChart插件实现组织架构图的展示
项目要做组织架构图,要把它做成自上而下的树形结构. 需要购买阿里云产品的,可以点击此链接购买,有红包优惠哦: https://promotion.aliyun.com/ntms/yunparter/i ...
- vue2-org-tree 基于VUE的部门组织架构组件,增删节点实现
本文所用组件传送门:vue-org-tree 本文基于antd (其他前端组件框架操作基本都类似的: iview,elementui,boostrap-vue...) 当然,github上还有其他类似 ...
- 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相信相信的力量! 从懵懂的少年,到拿起键盘,可以写一个Hell ...
- Atittit.研发公司的组织架构与部门架构总结
Atittit.研发公司的组织架构与部门架构总结 1. archi组织架构与 部门规划2 1.1. 最高五大组织机构2 1.2. 宗教事务部2 1.3. 制度与重大会议委员会2 1.4. 纠纷处理部: ...
随机推荐
- linux环境中,如何使用tar来创建压缩包?解压缩?
需求说明: 今天需要将一个tomcat目录打成压缩包,使用zip感觉有点慢,所以就想用tar来试试,之前一直使用tar的解压缩命令, 今天试试tar的压缩命令 操作过程: 1.通过tar的zcf选项进 ...
- go fmt格式化----“占位符”
https://studygolang.com/articles/2644 https://studygolang.com/static/pkgdoc/pkg/fmt.htm
- DotNetBar如何控制窗体样式
在C#中使用控件DevComponents.DotNetBar时,如何创建一个漂亮的窗口,并控制窗体样式呢? 1.新建一个DotNetBar窗体 2.使OFFICE窗口风格 ...
- android中sharedPreferences的用法(转)
SharedPreferences介绍: 做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等 ...
- Linux查看系统进程
1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps ...
- TIMEOUT HANDLING WITH HTTPCLIENT
https://www.thomaslevesque.com/2018/02/25/better-timeout-handling-with-httpclient/ The problem If yo ...
- [Unity官方文档翻译]Primitive and Placeholder Objects Unity原生3D物体教程
Primitive and Placeholder Objects 原始的基础物体 Unity can work with 3D models of any shape that can be cre ...
- ASP.NET MVC入门到精通——数据库仓储
业务层调用数据层对象,我不想每次都new一个数据层对象,而是在数据层创建一个仓储,统一管理所有的对象调用. 1.在IDAL项目中,新建IDBSession.tt模板 Ctrl+S后自动生成IDBS ...
- React Native(十三)——ios键盘挡住textInput
渐入佳境 用React Native重构的项目也快接近尾声,剩下的就是适配ios的功能了.慢慢地也从中琢磨出了一点门道,于是就遇见了键盘遮挡textInput问题斑斑: 正常页面: android点击 ...
- MVC的初步认识理论
说起来写博客可以说一个月没来啦,我们狠狠的放假一个月,想一想都奇怪.而是想一下以后的假期还会这样吗?或许这是作为学生的我们的最后一个长的假期啦,以后就要面对工作再也没有寒假暑假之分啦,在这一个月的时间 ...