antd的异步加载树组件使用

import { TreeSelect } from 'antd';

class Demo extends React.Component {
  state = {
    value: undefined,
    treeData: [
      { id: 1, pId: 0, value: '1', title: 'Expand to load' },
      { id: 2, pId: 0, value: '2', title: 'Expand to load' },
      { id: 3, pId: 0, value: '3', title: 'Tree Node', isLeaf: true },
    ],
  };

  genTreeNode = (parentId, isLeaf = false) => {
    const random = Math.random()
      .toString(36)
      .substring(2, 6);
    return {
      id: random,
      pId: parentId,
      value: random,
      title: isLeaf ? 'Tree Node' : 'Expand to load',
      isLeaf,
    };
  };

  onLoadData = treeNode =>
    new Promise(resolve => {
      const { id } = treeNode.props;
      setTimeout(() => {
        this.setState({
          treeData: this.state.treeData.concat([
            this.genTreeNode(id, false),
            this.genTreeNode(id, true),
          ]),
        });
        resolve();
      }, 300);
    });

  onChange = value => {
    console.log(value);
    this.setState({ value });
  };

  render() {
    const { treeData } = this.state;
    return (
      <TreeSelect
        treeDataSimpleMode
        style={{ width: '100%' }}
        value={this.state.value}
        dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
        placeholder="Please select"
        onChange={this.onChange}
        loadData={this.onLoadData}
        treeData={treeData}
      />
    );
  }
}

ReactDOM.render(<Demo />, mountNode);
  • 以上是antd中关于异步加载树节点的例子,下面来一个一个讲。
    • 首先是treeData,这个是构成树的数据。
      样例中给的是
      { id: 1, pId: 0, value: '1', title: 'Expand to load', isLeaf: true }
      其中id和pId分别表示的是自己的id和自己父节点的id,两种不能相同,因为不可能一个节点又是子节点又是父节点。所以自己在获取到初始数据的时候最好设Pid为0,id为index+1(indx从0开始),这样第一批子节点的父节点id就都为0了。至于value只要把他设置成和id一样即可,组件就是通过value来获取当前选中的条目。title就是节点的值,想让节点显示啥就设置成啥,isLeaf是是否有子节点的意思,所以一般用这个组件最好是让后台在参数里加上数据是否有子节点。
    • 其次是onChange方法。
        onChange = value => {
        console.log(value);
        this.setState({ value });
        };
    
    这个方法是在点击树节点时触发的,点击后组件会默认暴露出value的值,所以一般如果想获取点击节点的其他属性的话一般都是要通过这个value来获取(因为组件默认是不暴露其他属性的,如果真想要其他的方式获取可以去看官方的文档,我因为时间紧就用自己的办法了)。我自己的办法是用value的值去循环匹配数组里所有数据的value,因为之前我是默认设置成value和id一样,所以是能保证value的值是唯一的,且我在使用的时候数据量也不是很大,循环也没啥问题。
    • onLoadData方法
    onLoadData = treeNode =>
    new Promise(resolve => {
      const { id } = treeNode.props;
      setTimeout(() => {
        this.setState({
          treeData: this.state.treeData.concat([
            this.genTreeNode(id, false),
            this.genTreeNode(id, true),
          ]),
        });
        resolve();
      }, 300);
    });
    
    这个方法的作用是在点击树节点前的加载图标时,进行数据的异步加载。treeNode表示的是当前点击加载的节点,很多加载所需要的数据都可以从这里获取。在获取成功数据后会将获取到的数据放到genTreeNode方法中进行处理。
      genTreeNode = (parentId, isLeaf = false) => {
      const random = Math.random()
      .toString(36)
      .substring(2, 6);
      return {
      id: random,
      pId: parentId,
      value: random,
      title: isLeaf ? 'Tree Node' : 'Expand to load',
      isLeaf,
        };
      };
    
    这个方法的意思是将异步加载获取到的数据进行处理,也就是添加几个参数方便组件生成新的节点。其中要注意的是正常使用的时候这个方法触发一次就可以了,样例中是触发了两次,通过传入true和false给isLeaf,样例生成了有子节点的父节点和没有子节点的节点。实际中一般不需要这样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值