Skip to content

Commit 240e2e1

Browse files
author
dongxingbin
committed
init
1 parent cd23363 commit 240e2e1

File tree

9 files changed

+531
-1
lines changed

9 files changed

+531
-1
lines changed

.babelrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"presets": ["env", "react"]
3+
}

.gitignore

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# See https://help.github.com/ignore-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
6+
# dist
7+
/dist
8+
9+
# testing
10+
/coverage
11+
12+
# misc
13+
.DS_Store
14+
.env.local
15+
.env.development.local
16+
.env.test.local
17+
.env.production.local
18+
19+
npm-debug.log*
20+
yarn-debug.log*
21+
yarn-error.log*
22+
23+
package.lock.json
24+
examples/demo/.idea/workspace.xml

README.md

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,47 @@
11
# react-org-tree
2-
org tree component of react
2+
3+
> A simple organization tree chart based on react
4+
5+
### Installation
6+
7+
```
8+
# use npm
9+
npm i react-org-tree
10+
11+
# use yarn
12+
yarn add react-org-tree
13+
```
14+
### Usage
15+
16+
``` js
17+
import OrgTree from 'react-org-tree';
18+
19+
const horizontal = false;
20+
const data = {
21+
id: 0,
22+
label: 'XXX股份有限公司',
23+
children: [{
24+
id: 1,
25+
label: '技术部',
26+
children: [{
27+
id: 3,
28+
label: '后端'
29+
}, {
30+
id: 4,
31+
label: '前端'
32+
}]
33+
}, {
34+
id: 2,
35+
label: '人事部'
36+
}]
37+
}
38+
39+
<OrgTree
40+
data={data}
41+
horizontal={horizontal}
42+
>
43+
```
44+
45+
46+
47+

package.json

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"name": "react-org-tree",
3+
"version": "0.0.1",
4+
"description": "org tree component of react",
5+
"main": "dist/bundle.js",
6+
"files": [
7+
"dist",
8+
"lib"
9+
],
10+
"scripts": {
11+
"test": "echo \"Error: no test specified\" && exit 1",
12+
"build": "webpack"
13+
},
14+
"keywords": [
15+
"react",
16+
"tree",
17+
"org-tree",
18+
"react-org-tree",
19+
"react-org-chart"
20+
],
21+
"author": "artdong",
22+
"license": "MIT",
23+
"devDependencies": {
24+
"babel-core": "^6.26.0",
25+
"babel-loader": "^7.1.2",
26+
"babel-preset-env": "^1.6.1",
27+
"babel-preset-react": "^6.24.1",
28+
"classnames": "^2.2.6",
29+
"css-loader": "^2.0.1",
30+
"node-sass": "^4.11.0",
31+
"less": "^3.9.0",
32+
"less-loader": "^4.1.0",
33+
"prop-types": "^15.6.0",
34+
"react": "^16.2.0",
35+
"sass-loader": "^7.1.0",
36+
"style-loader": "^0.23.1",
37+
"webpack": "^3.10.0",
38+
"webpack-node-externals": "^1.6.0"
39+
},
40+
"dependencies": {}
41+
}

src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import OrgTree from './org_tree.jsx';
2+
3+
export default OrgTree

src/org_tree.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import React from 'react';
2+
3+
// 判断是否叶子节点
4+
const isLeaf = (data, prop) => {
5+
const node = prop.node;
6+
return !(Array.isArray(data[node.children]) && data[node.children].length > 0);
7+
};
8+
9+
// 创建 node 节点
10+
export const renderNode = (data, prop) => {
11+
const node = prop.node;
12+
const cls = ['org-tree-node'];
13+
const childNodes = [];
14+
15+
if (isLeaf(data, prop)) {
16+
cls.push('is-leaf');
17+
}
18+
19+
childNodes.push(renderLabel(data, prop));
20+
21+
if (data[node.expand]) {
22+
childNodes.push(renderChildren(data.children, prop));
23+
}
24+
25+
return React.createElement('div', {
26+
key: data.id,
27+
className: cls.join(' ')
28+
}, childNodes);
29+
};
30+
31+
// 创建 label 节点
32+
export const renderLabel = (data, prop) => {
33+
const node = prop.node;
34+
const label = data[node.label];
35+
const renderContent = prop.renderContent;
36+
37+
const childNodes = [];
38+
if (typeof renderContent === 'function') {
39+
let vnode = renderContent(data);
40+
41+
vnode && childNodes.push(vnode);
42+
} else {
43+
childNodes.push(label);
44+
}
45+
46+
const cls = ['org-tree-node-label-inner'];
47+
48+
return React.createElement('div', {
49+
className: 'org-tree-node-label',
50+
}, [React.createElement('div', {
51+
className: cls.join(' ')
52+
}, childNodes)]);
53+
};
54+
55+
// 创建 node 子节点
56+
export const renderChildren = (list, prop) => {
57+
if (Array.isArray(list) && list.length) {
58+
const children = list.map(item => {
59+
return renderNode(item, prop);
60+
});
61+
62+
return React.createElement('div', {
63+
className: 'org-tree-node-children'
64+
}, children);
65+
}
66+
return '';
67+
};
68+
69+
export const render = (props) => {
70+
return renderNode(props.data, props);
71+
};
72+
73+
export default render;
74+

src/org_tree.jsx

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import React, { Component } from 'react';
2+
import PropTypes from 'prop-types';
3+
import classnames from 'classnames';
4+
5+
import TreeNode from './org_tree.js';
6+
7+
//组件
8+
class OrgTree extends Component {
9+
constructor(props) {
10+
super(props);
11+
this.collapse = this.collapse.bind(this);
12+
this.toggleExpand = this.toggleExpand.bind(this);
13+
}
14+
15+
componentDidMount() {
16+
const { data } = this.props;
17+
this.toggleExpand(data, true);
18+
}
19+
20+
componentWillUnmount() {
21+
}
22+
23+
collapse(list) {
24+
let _this = this;
25+
list.forEach(function(child) {
26+
if (child.expand) {
27+
child.expand = false;
28+
}
29+
child.children && _this.collapse(child.children);
30+
});
31+
}
32+
33+
toggleExpand(data, val) {
34+
let _this = this;
35+
if (Array.isArray(data)) {
36+
data.forEach(function(item) {
37+
item.expand = val;
38+
if (item.children) {
39+
_this.toggleExpand(item.children, val);
40+
}
41+
});
42+
} else {
43+
data.expand = val;
44+
if (data.children) {
45+
_this.toggleExpand(data.children, val);
46+
}
47+
}
48+
this.forceUpdate();
49+
}
50+
51+
render() {
52+
const { data, node, horizontal, renderContent } = this.props;
53+
return <div className="org-tree-container">
54+
<div className={classnames('org-tree', {
55+
'horizontal': horizontal
56+
})}>
57+
<TreeNode
58+
data={data}
59+
node={node}
60+
renderContent={renderContent}
61+
/>
62+
</div>
63+
</div>;
64+
}
65+
}
66+
67+
OrgTree.propTypes = {
68+
data: PropTypes.object,
69+
node: PropTypes.object,
70+
horizontal: PropTypes.bool,
71+
renderContent: PropTypes.func
72+
};
73+
74+
OrgTree.defaultProps = {
75+
node: {
76+
label: 'label',
77+
expand: 'expand',
78+
children: 'children'
79+
},
80+
renderContent: function(data) {
81+
return data.label;
82+
}
83+
};
84+
85+
export default OrgTree;

0 commit comments

Comments
 (0)