当前位置:首页 > JavaScript

js实现树表

2026-02-02 14:06:12JavaScript

实现树表的基本思路

使用JavaScript实现树表(Tree Table)通常涉及将层级数据渲染为可展开/折叠的表格结构。核心步骤包括数据建模、DOM渲染和交互逻辑处理。

数据结构设计

树表数据通常为嵌套结构,每个节点包含自身数据和子节点数组:

const treeData = [
  {
    id: 1,
    name: 'Parent 1',
    children: [
      { id: 11, name: 'Child 1.1' },
      { id: 12, name: 'Child 1.2' }
    ]
  }
];

递归渲染方法

通过递归函数渲染树形结构,需处理缩进和展开状态:

function renderTreeTable(data, level = 0, parentId = '') {
  return data.map(item => {
    const hasChildren = item.children && item.children.length > 0;
    const rowId = parentId ? `${parentId}-${item.id}` : item.id;

    return `
      <tr data-id="${rowId}" data-level="${level}">
        <td style="padding-left: ${level * 20}px">
          ${hasChildren ? 
            `<button class="toggle" data-target="${rowId}">+</button>` : 
            '<span class="indent"></span>'}
          ${item.name}
        </td>
        <!-- 其他列数据 -->
      </tr>
      ${hasChildren ? renderTreeTable(item.children, level + 1, rowId) : ''}
    `;
  }).join('');
}

交互逻辑实现

绑定点击事件处理展开/折叠功能:

document.addEventListener('click', (e) => {
  if (e.target.classList.contains('toggle')) {
    const targetId = e.target.getAttribute('data-target');
    const rows = document.querySelectorAll(`tr[data-id^="${targetId}-"]`);

    rows.forEach(row => {
      row.style.display = row.style.display === 'none' ? '' : 'none';
    });

    e.target.textContent = e.target.textContent === '+' ? '-' : '+';
  }
});

完整示例代码

结合上述逻辑的完整实现示例:

class TreeTable {
  constructor(containerId, data) {
    this.container = document.getElementById(containerId);
    this.data = data;
    this.render();
  }

  render() {
    this.container.innerHTML = `
      <table>
        <thead><tr><th>Name</th></tr></thead>
        <tbody>${this.renderRows(this.data)}</tbody>
      </table>
    `;
    this.bindEvents();
  }

  renderRows(data, level = 0, parentId = '') {
    return data.map(item => {
      const hasChildren = item.children?.length > 0;
      const rowId = parentId ? `${parentId}-${item.id}` : item.id;

      return `
        <tr data-id="${rowId}" data-level="${level}">
          <td style="padding-left: ${level * 20}px">
            ${hasChildren ? 
              `<button class="toggle" data-target="${rowId}">+</button>` : 
              '<span class="indent"></span>'}
            ${item.name}
          </td>
        </tr>
        ${hasChildren ? this.renderRows(item.children, level + 1, rowId) : ''}
      `;
    }).join('');
  }

  bindEvents() {
    this.container.addEventListener('click', (e) => {
      if (e.target.classList.contains('toggle')) {
        this.toggleRow(e.target);
      }
    });
  }

  toggleRow(button) {
    const targetId = button.getAttribute('data-target');
    const rows = this.container.querySelectorAll(`tr[data-id^="${targetId}-"]`);

    rows.forEach(row => {
      row.style.display = row.style.display === 'none' ? '' : 'none';
    });

    button.textContent = button.textContent === '+' ? '-' : '+';
  }
}

// 使用示例
new TreeTable('treeTableContainer', treeData);

性能优化建议

对于大型树结构,考虑以下优化方案:

  • 虚拟滚动:只渲染可视区域内的节点
  • 懒加载:动态加载子节点数据
  • 使用文档片段(DocumentFragment)减少DOM操作次数

样式增强建议

通过CSS改善视觉效果:

.tree-table tr[data-level] > td {
  border-left: 1px dotted #ccc;
}

.toggle {
  cursor: pointer;
  background: none;
  border: none;
  width: 20px;
  text-align: center;
}

.indent {
  display: inline-block;
  width: 20px;
}

第三方库推荐

如需快速实现,可考虑现成解决方案:

js实现树表

  • jsTree:支持表格集成的树插件
  • AG Grid:企业级表格组件含树形展示功能
  • D3.js:数据驱动文档的复杂树形可视化

标签: js
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码 funct…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…