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}

weijie
164 声望7 粉丝