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

如何从JSON数据生成Flutter TreeView树形视图

实现简易动态树形视图方案

第一步:将扁平JSON数据转换为嵌套树形结构

首先需要把包含parentID、childID、treeName的扁平数据转换成嵌套树形结构,这是动态渲染的基础。以下是JavaScript核心实现逻辑:

function buildTree(data) {
  const nodeMap = new Map();
  const rootNodes = [];

  // 先将所有节点存入映射表,方便后续查找父节点
  data.forEach(item => {
    nodeMap.set(item.childID, {
      id: item.childID,
      name: item.treeName,
      children: []
    });
  });

  // 遍历数据,将子节点挂载到对应父节点下
  data.forEach(item => {
    const node = nodeMap.get(item.childID);
    // 根节点的parentID可根据实际数据调整(比如null、0或特定标识)
    if (item.parentID === null || item.parentID === 0) {
      rootNodes.push(node);
    } else {
      const parentNode = nodeMap.get(item.parentID);
      if (parentNode) {
        parentNode.children.push(node);
      }
    }
  });

  return rootNodes;
}

第二步:动态渲染树形DOM结构

通过递归函数将嵌套树形数据渲染成带折叠/展开功能的简易HTML结构:

function renderTree(nodes, container) {
  const ul = document.createElement('ul');
  ul.style.listStyle = 'none';
  ul.style.paddingLeft = '15px';

  nodes.forEach(node => {
    const li = document.createElement('li');
    
    // 折叠/展开按钮
    const toggleBtn = document.createElement('span');
    toggleBtn.textContent = node.children.length > 0 ? '+' : '';
    toggleBtn.style.cursor = 'pointer';
    toggleBtn.style.marginRight = '5px';

    // 节点名称
    const nameSpan = document.createElement('span');
    nameSpan.textContent = node.name;

    li.appendChild(toggleBtn);
    li.appendChild(nameSpan);

    // 有子节点时递归渲染并绑定折叠事件
    if (node.children.length > 0) {
      const childContainer = document.createElement('div');
      childContainer.style.display = 'none'; // 默认折叠子节点
      renderTree(node.children, childContainer);
      li.appendChild(childContainer);

      toggleBtn.addEventListener('click', () => {
        const isHidden = childContainer.style.display === 'none';
        childContainer.style.display = isHidden ? 'block' : 'none';
        toggleBtn.textContent = isHidden ? '-' : '+';
      });
    }

    ul.appendChild(li);
  });

  container.appendChild(ul);
}

第三步:调用示例

假设你的JSON数据格式如下,直接调用上述函数即可生成树形视图:

// 示例数据,替换成你的实际JSON数据
const treeData = [
  { parentID: null, childID: 1, treeName: '根节点1' },
  { parentID: 1, childID: 2, treeName: '子节点1-1' },
  { parentID: 1, childID: 3, treeName: '子节点1-2' },
  { parentID: 3, childID: 4, treeName: '子节点1-2-1' },
  { parentID: null, childID: 5, treeName: '根节点2' }
];

// 构建树形结构
const tree = buildTree(treeData);
// 渲染到页面指定容器(比如id为tree-container的div)
const container = document.getElementById('tree-container');
renderTree(tree, container);

样式优化(可选)

可以根据需求调整基础样式,让树形视图更贴合预期:

#tree-container ul {
  margin: 0;
  padding-left: 20px;
}

#tree-container li {
  margin: 4px 0;
}

#tree-container span:first-child {
  color: #666;
}

这个方案完全基于动态数据生成,无需硬编码节点,占用屏幕空间小且支持折叠展开,符合你要的简易树形视图需求。

内容的提问来源于stack exchange,提问作者Sulfy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:22:17