You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用MUI TreeView渲染带引用关系的API树形数据?

用MUI TreeView渲染关联树形数据的实现步骤

1. 先把扁平API数据转换为嵌套树形结构

首先需要将API返回的扁平数据处理成MUI TreeView所需的嵌套结构。根据你提到的关联规则(子节点通过entry.item.id关联父节点的id),可以编写如下转换函数:

// 转换扁平数据为树形结构
const buildTree = (data) => {
  const nodeMap = new Map();
  const tree = [];

  // 先把所有节点存入Map,方便快速查找
  data.forEach(node => {
    nodeMap.set(node.id, { ...node, children: [] });
  });

  // 遍历每个节点,找到对应的父节点并添加为子节点
  data.forEach(node => {
    if (node.entry?.item?.id) {
      const parentId = node.entry.item.id;
      const parentNode = nodeMap.get(parentId);
      if (parentNode) {
        parentNode.children.push(nodeMap.get(node.id));
      }
    } else {
      // 无父节点的为根节点,直接加入树形数组
      tree.push(nodeMap.get(node.id));
    }
  });

  return tree;
};

2. 递归渲染MUI TreeView组件

接下来需要创建递归组件,用来渲染嵌套的TreeItem。以下是完整的组件示例(需提前导入MUI相关组件):

import React, { useState, useEffect } from 'react';
import TreeView from '@mui/lab/TreeView';
import TreeItem from '@mui/lab/TreeItem';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import ChevronRightIcon from '@mui/icons-material/ChevronRight';

const CustomTreeView = () => {
  const [treeData, setTreeData] = useState([]);

  // 从API获取并处理数据
  useEffect(() => {
    const fetchData = async () => {
      // 替换为你的实际API请求逻辑
      const response = await fetch('/your-api-endpoint');
      const apiData = await response.json();
      // 转换为树形结构
      const formattedTree = buildTree(apiData);
      setTreeData(formattedTree);
    };

    fetchData();
  }, []);

  // 递归渲染节点
  const renderTree = (nodes) => (
    nodes.map((node) => (
      <TreeItem key={node.id} nodeId={node.id} label={node.name}>
        {node.children && node.children.length > 0 && renderTree(node.children)}
      </TreeItem>
    ))
  );

  // 数据转换函数
  const buildTree = (data) => {
    const nodeMap = new Map();
    const tree = [];

    data.forEach(node => {
      nodeMap.set(node.id, { ...node, children: [] });
    });

    data.forEach(node => {
      if (node.entry?.item?.id) {
        const parentId = node.entry.item.id;
        const parentNode = nodeMap.get(parentId);
        if (parentNode) {
          parentNode.children.push(nodeMap.get(node.id));
        }
      } else {
        tree.push(nodeMap.get(node.id));
      }
    });

    return tree;
  };

  return (
    <TreeView
      aria-label="关联树形结构"
      defaultCollapseIcon={<ExpandMoreIcon />}
      defaultExpandIcon={<ChevronRightIcon />}
      sx={{ height: 240, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }}
    >
      {renderTree(treeData)}
    </TreeView>
  );
};

export default CustomTreeView;

关键说明

  • 数据转换逻辑:通过Map存储所有节点,遍历每个节点时根据entry.item.id匹配父节点,将当前节点添加到父节点的children数组;无父节点的直接作为根节点。
  • 递归渲染:renderTree函数遍历节点,若节点存在子节点则递归调用自身,生成嵌套的TreeItem结构。
  • 依赖检查:确保已安装@mui/lab(TreeView属于实验性组件)、@mui/material和@mui/icons-material依赖包。

内容的提问来源于stack exchange,提问作者Oğuzhan Yıldırım

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:12:31