antd的异步加载树组件使用

绝地灬酷狼 2023-07-14 10:32 59阅读 0赞
  1. import { TreeSelect } from 'antd';
  2. class Demo extends React.Component {
  3. state = {
  4. value: undefined,
  5. treeData: [
  6. { id: 1, pId: 0, value: '1', title: 'Expand to load' },
  7. { id: 2, pId: 0, value: '2', title: 'Expand to load' },
  8. { id: 3, pId: 0, value: '3', title: 'Tree Node', isLeaf: true },
  9. ],
  10. };
  11. genTreeNode = (parentId, isLeaf = false) => {
  12. const random = Math.random()
  13. .toString(36)
  14. .substring(2, 6);
  15. return {
  16. id: random,
  17. pId: parentId,
  18. value: random,
  19. title: isLeaf ? 'Tree Node' : 'Expand to load',
  20. isLeaf,
  21. };
  22. };
  23. onLoadData = treeNode =>
  24. new Promise(resolve => {
  25. const { id } = treeNode.props;
  26. setTimeout(() => {
  27. this.setState({
  28. treeData: this.state.treeData.concat([
  29. this.genTreeNode(id, false),
  30. this.genTreeNode(id, true),
  31. ]),
  32. });
  33. resolve();
  34. }, 300);
  35. });
  36. onChange = value => {
  37. console.log(value);
  38. this.setState({ value });
  39. };
  40. render() {
  41. const { treeData } = this.state;
  42. return (
  43. <TreeSelect
  44. treeDataSimpleMode
  45. style={
  46. { width: '100%' }}
  47. value={this.state.value}
  48. dropdownStyle={
  49. { maxHeight: 400, overflow: 'auto' }}
  50. placeholder="Please select"
  51. onChange={this.onChange}
  52. loadData={this.onLoadData}
  53. treeData={treeData}
  54. />
  55. );
  56. }
  57. }
  58. 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 => {

      1. console.log(value);
      2. this.setState({ value });
      3. };

    这个方法是在点击树节点时触发的,点击后组件会默认暴露出value的值,所以一般如果想获取点击节点的其他属性的话一般都是要通过这个value来获取(因为组件默认是不暴露其他属性的,如果真想要其他的方式获取可以去看官方的文档,我因为时间紧就用自己的办法了)。我自己的办法是用value的值去循环匹配数组里所有数据的value,因为之前我是默认设置成value和id一样,所以是能保证value的值是唯一的,且我在使用的时候数据量也不是很大,循环也没啥问题。

    • onLoadData方法

      onLoadData = treeNode =>
      new Promise(resolve => {
      const { id } = treeNode.props;
      setTimeout(() => {

      1. this.setState({
      2. treeData: this.state.treeData.concat([
      3. this.genTreeNode(id, false),
      4. this.genTreeNode(id, true),
      5. ]),
      6. });
      7. resolve();

      }, 300);
      });

    这个方法的作用是在点击树节点前的加载图标时,进行数据的异步加载。treeNode表示的是当前点击加载的节点,很多加载所需要的数据都可以从这里获取。在获取成功数据后会将获取到的数据放到genTreeNode方法中进行处理。

    1. genTreeNode = (parentId, isLeaf = false) => {
    2. const random = Math.random()
    3. .toString(36)
    4. .substring(2, 6);
    5. return {
    6. id: random,
    7. pId: parentId,
    8. value: random,
    9. title: isLeaf ? 'Tree Node' : 'Expand to load',
    10. isLeaf,
    11. };
    12. };

    这个方法的意思是将异步加载获取到的数据进行处理,也就是添加几个参数方便组件生成新的节点。其中要注意的是正常使用的时候这个方法触发一次就可以了,样例中是触发了两次,通过传入true和false给isLeaf,样例生成了有子节点的父节点和没有子节点的节点。实际中一般不需要这样。

发表评论

表情:
评论列表 (有 0 条评论,59人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue.js之组件异步

    当项目中组件特别多的时候,通过webpack打包的组件非常多,如果在访问其中某一个路由对应的组件时,加载了所有组件的文件,对于性能的消耗是非常浪费的。 此时,我们就需要使用

    相关 react之组件异步

    我们在用react的时候,希望组件异步加载,提高性能,那么应该怎么实现呢? 往下看。。。 解释一波: react异步加载的方法很多,这里只说一种,因为这一种直接使用r