2
0

Tree.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import { Button, Tree } from "antd";
  2. import type { Key } from "antd/lib/table/interface"
  3. import { useState } from "react";
  4. interface DataNode {
  5. title: string;
  6. key: string;
  7. level?: number;
  8. children?: DataNode[];
  9. deletedAt?: string | null;
  10. isLeaf?: boolean;
  11. }
  12. const initTreeData: DataNode[] = [
  13. { title: "Expand to load", key: "0" },
  14. { title: "Expand to load", key: "1" },
  15. { title: "Tree Node", key: "2", isLeaf: true },
  16. ];
  17. // It's just a simple demo. You can use tree map to optimize update perf.
  18. const updateTreeData = (
  19. list: DataNode[],
  20. key: React.Key,
  21. children: DataNode[]
  22. ): DataNode[] =>
  23. list.map((node) => {
  24. if (node.key === key) {
  25. return {
  26. ...node,
  27. children,
  28. };
  29. }
  30. if (node.children) {
  31. return {
  32. ...node,
  33. children: updateTreeData(node.children, key, children),
  34. };
  35. }
  36. return node;
  37. });
  38. const Widget = () => {
  39. const [_selectedKeys, setSelectedKeys] = useState<Key[]>();
  40. const [_expandedKeys, setExpandedKeys] = useState<Key[]>();
  41. const [treeData, setTreeData] = useState<DataNode[]>(initTreeData);
  42. const onLoadData = ({ key, children }: any) =>
  43. new Promise<void>((resolve) => {
  44. if (children) {
  45. resolve();
  46. return;
  47. }
  48. setTimeout(() => {
  49. setTreeData((origin) =>
  50. updateTreeData(origin, key, [
  51. { title: "Child Node", key: `${key}-0` },
  52. { title: "Child Node", key: `${key}-1` },
  53. ])
  54. );
  55. resolve();
  56. }, 1000);
  57. });
  58. const _____onLoad = ({ key, children }: any) =>
  59. new Promise<void>((resolve) => {
  60. if (children) {
  61. resolve();
  62. return;
  63. }
  64. setTimeout(() => {
  65. setTreeData((origin) =>
  66. updateTreeData(origin, key, [
  67. { title: "Child Node", key: `${key}-0` },
  68. { title: "Child Node", key: `${key}-1` },
  69. ])
  70. );
  71. resolve();
  72. }, 1000);
  73. });
  74. return (
  75. <>
  76. <Button
  77. onClick={() => {
  78. setTreeData((origin) => {
  79. return [...origin, { title: "title3", key: "title3" }];
  80. });
  81. }}
  82. >
  83. add
  84. </Button>
  85. <Button
  86. onClick={() => {
  87. setExpandedKeys(["title1"]);
  88. setSelectedKeys(["title1-2"]);
  89. }}
  90. >
  91. expand
  92. </Button>
  93. <Tree
  94. treeData={treeData}
  95. onSelect={(selectedKeys: Key[]) => setSelectedKeys(selectedKeys)}
  96. loadData={onLoadData}
  97. />
  98. </>
  99. );
  100. };
  101. export default Widget;