TocTree.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { Tree } from "antd";
  2. import type { TreeProps } from "antd/es/tree";
  3. import type { ListNodeData } from "../studio/EditableTree";
  4. type TreeNodeData = {
  5. key: string;
  6. title: string;
  7. children: TreeNodeData[];
  8. level: number;
  9. };
  10. function tocGetTreeData(listData: ListNodeData[], active = "") {
  11. let treeData = [];
  12. let tocActivePath: TreeNodeData[] = [];
  13. let treeParents = [];
  14. let rootNode: TreeNodeData = {
  15. key: "0",
  16. title: "root",
  17. level: 0,
  18. children: [],
  19. };
  20. treeData.push(rootNode);
  21. let lastInsNode: TreeNodeData = rootNode;
  22. let iCurrLevel = 0;
  23. for (let index = 0; index < listData.length; index++) {
  24. const element = listData[index];
  25. let newNode: TreeNodeData = {
  26. key: element.key,
  27. title: element.title,
  28. children: [],
  29. level: element.level,
  30. };
  31. /*
  32. if (active == element.article) {
  33. newNode["extraClasses"] = "active";
  34. }
  35. */
  36. if (newNode.level > iCurrLevel) {
  37. //新的层级比较大,为上一个的子目录
  38. treeParents.push(lastInsNode);
  39. lastInsNode.children.push(newNode);
  40. } else if (newNode.level === iCurrLevel) {
  41. //目录层级相同,为平级
  42. treeParents[treeParents.length - 1].children.push(newNode);
  43. } else {
  44. // 小于 挂在上一个层级
  45. while (treeParents.length > 1) {
  46. treeParents.pop();
  47. if (treeParents[treeParents.length - 1].level < newNode.level) {
  48. break;
  49. }
  50. }
  51. treeParents[treeParents.length - 1].children.push(newNode);
  52. }
  53. lastInsNode = newNode;
  54. iCurrLevel = newNode.level;
  55. if (active === element.key) {
  56. tocActivePath = [];
  57. for (let index = 1; index < treeParents.length; index++) {
  58. //treeParents[index]["expanded"] = true;
  59. tocActivePath.push(treeParents[index]);
  60. }
  61. }
  62. }
  63. return treeData[0].children;
  64. }
  65. type IWidgetTocTree = {
  66. treeData: ListNodeData[];
  67. };
  68. const onSelect: TreeProps["onSelect"] = (selectedKeys, info) => {
  69. //let aaa: NewTree = info.node;
  70. console.log("selected", selectedKeys);
  71. };
  72. const Widget = ({ treeData }: IWidgetTocTree) => {
  73. const data = tocGetTreeData(treeData);
  74. //const [expandedKeys] = useState(["0-0", "0-0-0", "0-0-0-0"]);
  75. return (
  76. <>
  77. <Tree onSelect={onSelect} treeData={data} />
  78. </>
  79. );
  80. };
  81. export default Widget;