import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; import TreeNode from './org_tree'; import './org_tree.less'; import StandardNode from './standard_node'; import SimpleNode from './simple_node'; //组件 class OrgTree extends Component { constructor(props) { super(props); this.handleExpand = this.handleExpand.bind(this); this.collapse = this.collapse.bind(this); this.toggleExpand = this.toggleExpand.bind(this); } componentDidMount() { const { expandAll, data } = this.props; if(expandAll) this.toggleExpand(data, true); } componentDidUpdate(prevProps, prevState) { if (prevProps.data !== this.props.data) { const { expandAll, data } = this.props; if(expandAll) this.toggleExpand(data, true); } } componentWillUnmount() { } handleExpand(e, nodeData) { if ('expand' in nodeData) { nodeData.expand = !nodeData.expand; if (!nodeData.expand && nodeData.children) { this.collapse(nodeData.children); } this.forceUpdate(); }else { nodeData.expand = true; this.forceUpdate(); } } collapse(list) { let _this = this; list.forEach(function(child) { if (child.expand) { child.expand = false; } child.children && _this.collapse(child.children); }); } toggleExpand(data, val) { let _this = this; if (Array.isArray(data)) { data.forEach(function(item) { item.expand = val; if (item.children) { _this.toggleExpand(item.children, val); } }); } else { data.expand = val; if (data.children) { _this.toggleExpand(data.children, val); } } this.forceUpdate(); } render() { const { horizontal, node, data, onClick } = this.props; return
this.handleExpand(e, nodeData)} onClick={(e, nodeData)=> onClick && onClick(e, nodeData)} {...this.props} />
; } } OrgTree.propTypes = { data: PropTypes.object, node: PropTypes.object, horizontal: PropTypes.bool, collapsable: PropTypes.bool, expandAll: PropTypes.bool, renderContent: PropTypes.func, labelWidth: PropTypes.number, labelClassName: PropTypes.string, onClick: PropTypes.func, treeType:PropTypes.string, openSidePage:PropTypes.func } OrgTree.defaultProps = { node: { label: 'label', expand: 'expand', children: 'children' }, renderContent: function(data,treeType,openSidePage) { if(treeType == 'simple') { return React.createElement(SimpleNode, { key: Date.now(), data: data // className: 'x'.join(' ') }, []); }else{ return React.createElement(StandardNode, { key: Date.now(), data: data, openSidePage: openSidePage // className: 'x'.join(' ') }, []); } } }; export default OrgTree;