资讯专栏INFORMATION COLUMN

antd 树形组件常用工具

plokmju88 / 2020人阅读

摘要:解除禁用系统异常添加修改删除搜索调用地址选择方法方法显示哪些按钮可可搜索数据类型获取成功公司研发部产品产品财务部会计外包科技部

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 (
                
                    {this.renderTreeNodes(item.children)}
                
            );
        }
        return ;
    })

    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 ? (
                
                    {beforeStr}
                    {searchValue}
                    {afterStr}
        
            ) : {item.title};
            if (item.children) {
                return (
                    
                        {loop(item.children)}
                    
                );
            }
            return ;
        });
        return(
            
{this.props.button?
{this.props.button.includes("add")?:""} {this.props.button.includes("update")?:""} {this.props.button.includes("delete")?:""}
:"" } {this.props.searchable?:""} {loop(this.state.treeData)}
) } }
调用
 const treeOption = {
    treeurl:React.rootDirectoryUrl+"/department/getDepartmentTree",//地址
    selectMethod:this.onSelect, //选择方法
    checkMethod:this.onCheck ,//chect方法
    button:["add","update","delete"],//显示哪些按钮
    checkable:true,//可check
    searchable:true,//可搜索

}


数据类型

{
"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}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110189.html

相关文章

  • React diff原理探究以及应用实践

    摘要:但是加了一定要比没加的性能更高吗我们再来看一个例子现在有一集合渲染成如下的样子现在我们将这个集合的顺序打乱变成。不加操作修改第个到第个节点的如果我们对这个集合进行增删的操作改成。 抛砖引玉 React通过引入Virtual DOM的概念,极大地避免无效的Dom操作,已使我们的页面的构建效率提到了极大的提升。但是如何高效地通过对比新旧Virtual DOM来找出真正的Dom变化之处同样也...

    EasonTyler 评论0 收藏0
  • 实现antd的按需加载

    摘要:使用来进行按需加载安装关于插件的介绍和使用,可参考使用这个插件之后仍然可以用来引入组件,但是这个时候插件会帮你转换成的写法。另外此插件配合属性可以做到模块样式的按需自动加载。 引言 create-react-app:是一个创建react项目特别方便的脚手架,他帮我们配置好了各种需要使用的工具,减少了很多工作量。antd:是蚂蚁金服推出的一个很优秀的react UI库,其中包含了很多我...

    0xE7A38A 评论0 收藏0
  • 用Browserify构建antd-mobile应用

    摘要:但在中,这一问题该如何解决呢使用遇到的问题如何自定义模块文件后缀名的优先级和一样,也提供了一个叫的配置选项,用于设定模块文件的后缀名及其优先级。 antd-mobile是蚂蚁金服出的移动端设计指南和前端框架,它提供了一套基于React的移动端组件库,可以很方便地用来开发体验良好的移动应用。 使用antd-mobile遇到的问题:react-native模块找不到 在阅读了antd-mo...

    tain335 评论0 收藏0
  • 面试官(6): 写过『通用前端组件』吗?

    摘要:很久没上掘金发现草稿箱里存了好几篇没发的文章最近梳理下发出来往期面试官系列如何实现深克隆面试官系列的实现面试官系列前端路由的实现面试官系列基于数据劫持的双向绑定优势所在面试官系列你为什么使用前端框架前言设计前端组件是最能考验开发者基本功的测 很久没上掘金,发现草稿箱里存了好几篇没发的文章,最近梳理下发出来 往期 面试官系列(1): 如何实现深克隆 面试官系列(2): Event Bus...

    waltr 评论0 收藏0
  • JSON生成Form表单

    摘要:是校验表单组件数据正确性的字段,其值为数组,里面的数组元素可以为。所以数组元素如果为的话,其内容就是的。到目前为止,表单适合大部分的表单应用场景。 JSON表单 描述 JSON表单是一个基于React的抽象组件,它可以把JSON数据格式描述的表单转换成项目中的表单,它可以用简短的几行代码,快速的生成Form表单。JSON表单的优点是: 可以快速构建出一个表单 表单的数据、逻辑、视图分...

    bingchen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<