React Material UI 树视图 - 在子节点 onNodeSelect 上获取根节点信息

React Material UI tree view - Getting root node info on child node onNodeSelect

我有一个如下所示的树视图代码

    <TreeView
      defaultCollapseIcon={<ArrowCircleUpIcon />}
      defaultExpandIcon={<ArrowCircleDownIcon />}
      onNodeSelect={handleChange}
      sx={{ height: 240, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }}
    >
      {loop(values)}
    </TreeView>

以及如下所示的 handleChange 方法

 const handleChange = async (event, node) => {
    console.log('nodeId: ', node)   
}

我的疑问是,在 handleChange 方法中,我使用节点参数获取 selected 节点信息。但我想要实现的是获得 selected 节点或整个父层次结构的父级 就像 A 有子 B 节点一样,B 有子 C 节点。所以如果我 select C 我是否会得到所有的 A、B、C 节点信息。我是新手,请帮助我。

直接来自 MUI 文档:

event: The event source of the callback nodeIds: Ids of the selected nodes. When multiSelect is true this is an array of strings; when false (default) a string.

这意味着当 multiSelect 不正确时(您的场景),nodeIds 将仅包含所选节点的 ID。

您可以通过使用 nodeIds 中的 id 并在数组中查找它来获取 C 节点的整个层次结构。

[第二次编辑] 希望这会有所帮助:

import React, { useEffect, useState } from "react";
import TreeView from "@mui/lab/TreeView";
import TreeItem from "@mui/lab/TreeItem";

export const TreeViewFile = () => {
  const [selectedNode, setSelectedNode] = useState({});
  const [selectedRoot, setSelectedRoot] = useState({});

  useEffect(() => {
    // This will be called for each new value of selectedNode, including the initial empty one
    // Here is where you can make your API call
    console.log("selectedNode", selectedNode);
    console.log("selectedRoo", selectedRoot);
  }, [selectedNode, selectedRoot]);

  const handleChange = (event, nodeId) => {
    treeViewArr.forEach((treeRoot) => {
      if(treeRoot.id === nodeId){
        setSelectedRoot(treeRoot);
        setSelectedNode(treeRoot);
        return
      }

      handleSelectedNode(treeRoot.childNodes, treeRoot, nodeId);
    });
  };

  const handleSelectedNode = (childNodes, treeRoot, nodeId) => {
    if (!childNodes) {
      return;
    }

    for (let i = 0; i < childNodes.length; i++) {
      let childNode = childNodes[i];
      if (childNode.id === nodeId) {
        setSelectedRoot(treeRoot);
        setSelectedNode(childNode);
        return;
      }

      handleSelectedNode(childNode.childNodes || [], treeRoot, nodeId);
    }
  };

  const displayTreeView = (treeViewArray) => {
    if (!treeViewArray) {
      return null;
    }
    return treeViewArray.map((treeViewItem) => {
      return (
        <TreeItem
          key={treeViewItem.id}
          nodeId={`${treeViewItem.id}`}
          label={treeViewItem.title}
        >
          {displayTreeView(treeViewItem.childNodes)}
        </TreeItem>
      );
    });
  };

  return (
    <>
      This is the selectedNode: {selectedNode?.title}
      <TreeView
        onNodeSelect={handleChange}
        sx={{ height: 240, flexGrow: 1, maxWidth: 800, overflowY: "auto" }}
      >
        {displayTreeView(treeViewArr)}
      </TreeView>
    </>
  );
};

const treeViewArr = [
  {
    id: "1",
    title: "First Parent Node",
    childNodes: [
      {
        id: "2",
        parentId: "1",
        title: "First Child Node of First Parent Node",
        childNodes: [
          {
            id: "3",
            parentId: "2",
            title: "First Child Node of First Child Node",
          },
        ],
      },
      {
        id: "4",
        parentId: "1",
        title: "Second Child Node of First Parent Node",
        childNodes: [
          {
            id: "5",
            parentId: "4",
            title: "First Child Node of Second Child Node",
          },
        ],
      },
    ],
  },
  {
    id: "6",
    title: "Second Parent Node",
    childNodes: [
      {
        id: "7",
        parentId: "6",
        title: "First Child Node of Second Parent Node",
        childNodes: [
          {
            id: "8",
            parentId: "7",
            title: "First Child Node of First Child Node of Second Parent Node",
          },
        ],
      },
      {
        id: "9",
        parentId: "6",
        title: "Second Child Node",
        childNodes: [
          {
            id: "10",
            parentId: "9",
            title:
              "First Child Node of Second Child Node of Second Parent Node",
          },
        ],
      },
    ],
  },
];