treeUtil.js
import {Tree,message,Button,Input } from 'antd';
import React from 'react'
import axios from 'axios'
const { TreeNode } = Tree;
const Search = Input.Search;
const getParentKey = (key, tree) => {
let parentKey;
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.children) {
if (node.children.some(item => item.key === key)) {
parentKey = node.key;
} else if (getParentKey(key, node.children)) {
parentKey = getParentKey(key, node.children);
}
}
}
return parentKey;
};
const dataList = [];
const generateList = (data) => {
for (let i = 0; i < data.length; i++) {
const node = data[i];
const key = node.key;
dataList.push({ key, title: node.title });
if (node.children) {
generateList(node.children);
}
}
};
export default class treeUtil extends React.Component{
constructor(props) {
super(props);
this.state = {
treeData:[]
};
}
componentWillMount (){
this.getTree();
}
getTree(){
axios.get(this.props.treeurl).then(res =>{
generateList(res.data.data)
this.setState({
treeData:res.data.data,
haveTreeData:true,
expandedKeys: [],
searchValue: '',
autoExpandParent: true,
})
})
}
onExpand = (expandedKeys) => {
this.setState({
expandedKeys,
autoExpandParent: false,
});
}
onSelect = (selectedKeys) => {
console.log(this.props)
// this.formRef.setState({
// disabled:true
// })
this.setState({ selectedKeys});
if(selectedKeys.length>0 && this.props.selectMethod){
this.props.selectMethod(selectedKeys)
}
}
onChange = (e) => {
const value = e.target.value;
const newExpandedKeys = []
let expandedKeys = dataList.map((item) => {
if (item.title.indexOf(value) > -1) {
return getParentKey(item.key, this.state.treeData);
}
return null;
}).filter((item, i, self) => item && self.indexOf(item) === i);
expandedKeys.forEach(x=>{
newExpandedKeys.push(x.toString())
})
this.setState({
expandedKeys:newExpandedKeys,
searchValue: value,
autoExpandParent: true,
});
}
onCheck = (checkedKeys) => {
console.log('onCheck', checkedKeys);
if(checkedKeys.length>0 && this.props.checkMethod){
this.props.checkMethod(checkedKeys)
}
this.setState({ checkedKeys });
}
renderTreeNodes = data => data.map((item) => {
if (item.children) {
return (
<TreeNode title={item.title} key={item.key} dataRef={item}>
{this.renderTreeNodes(item.children)}
</TreeNode>
);
}
return <TreeNode {...item} />;
})
addTree(){
// //解除禁用
// this.formRef.setState({
// disabled:false
// })
let selectedKey = null;
if(this.state.selectedKeys){
selectedKey= this.state.selectedKeys[0]
}else {
selectedKey = null;
}
}
change(){
// this.formRef.setState({
// disabled:false
// })
}
delete(){
axios.get(this.props.deleteUrl+this.state.selectedKeys[0] ).then(res =>{
if(res.data.success){
message.success(res.message);
this.getTree()
this.formRef.props.form.resetFields();
}else{
message.warning("系统异常");
}
})
}
render(){
const { searchValue, expandedKeys, autoExpandParent } = this.state;
const loop = data => data.map((item) => {
const index = item.title.indexOf(searchValue);
const beforeStr = item.title.substr(0, index);
const afterStr = item.title.substr(index + searchValue.length);
const title = index > -1 ? (
<span>
{beforeStr}
<span style={{ color: 'blue' }}>{searchValue}</span>
{afterStr}
</span>
) : <span>{item.title}</span>;
if (item.children) {
return (
<TreeNode key={item.key} title={title}>
{loop(item.children)}
</TreeNode>
);
}
return <TreeNode key={item.key} title={title} />;
});
return(
<div>
{this.props.button?
<div className="btn-group">
{this.props.button.includes("add")?<Button type="primary" onClick={this.addTree.bind(this)}>添加</Button>:""}
{this.props.button.includes("update")?<Button type="primary" onClick={this.change.bind(this)}>修改</Button>:""}
{this.props.button.includes("delete")?<Button type="primary" onClick={this.delete.bind(this)}>删除</Button>:""}
</div>:""
}
{this.props.searchable?<Search style={{ marginBottom: 8 }} placeholder="搜索" onChange={this.onChange} />:""}
<Tree
onExpand={this.onExpand}
expandedKeys={this.state.expandedKeys}
autoExpandParent={this.state.autoExpandParent}
onSelect={this.onSelect}
selectedKeys={this.state.selectedKeys}
checkable = {this.props.checkable}
>
{loop(this.state.treeData)}
</Tree>
</div>
)
}
}
调用
const treeOption = {
treeurl:React.rootDirectoryUrl+"/department/getDepartmentTree",//地址
selectMethod:this.onSelect, //选择方法
checkMethod:this.onCheck ,//chect方法
button:["add","update","delete"],//显示哪些按钮
checkable:true,//可check
searchable:true,//可搜索
}
<TreeUtil
{...treeOption}
/>
数据类型
{
"code":"200",
"message":"获取成功",
"data":[
{
"key":45,
"title":"公司",
"pid":null,
"children":[
{
"key":46,
"title":"研发部",
"pid":45,
"children":[
{
"key":48,
"title":"产品1",
"pid":46,
"children":[]
},{
"key":49,
"title":"产品2",
"pid":46,
"children":[]
}
]
},{
"key":50,
"title":"财务部",
"pid":45,
"children":[
{
"key":52,
"title":"会计",
"pid":50,
"children":[]
}
]
}
]
},{
"key":53,
"title":"外包",
"pid":null,
"children":[
{"key":54,"title":"科技部","pid":53,"children":[]}
]
}
],"success":true}