当前位置:首页 > 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 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…