当前位置:首页 > JavaScript

怎么用js实现树状表格

2026-03-01 23:55:27JavaScript

实现树状表格的基本思路

树状表格的核心是通过递归或循环渲染嵌套结构的数据,通常结合DOM操作或前端框架(如Vue/React)实现。以下提供两种常见实现方式。

怎么用js实现树状表格

原生JavaScript实现

通过递归渲染嵌套的HTML结构,结合事件控制展开/折叠。

怎么用js实现树状表格

<!-- HTML结构 -->
<table id="treeTable">
  <thead>
    <tr><th>名称</th><th>操作</th></tr>
  </thead>
  <tbody id="treeBody"></tbody>
</table>
// 示例数据
const treeData = [
  {
    name: "父节点1",
    children: [
      { name: "子节点1-1" },
      { name: "子节点1-2" }
    ]
  },
  {
    name: "父节点2",
    children: [
      { 
        name: "子节点2-1",
        children: [{ name: "孙节点2-1-1" }]
      }
    ]
  }
];

// 渲染函数
function renderTree(data, parentElement, level = 0) {
  data.forEach(item => {
    const row = document.createElement('tr');
    row.innerHTML = `
      <td style="padding-left: ${level * 20}px">
        ${item.children ? '<span class="toggle">+</span>' : ''}
        ${item.name}
      </td>
      <td><button>操作</button></td>
    `;
    parentElement.appendChild(row);

    if (item.children) {
      const childRow = document.createElement('tr');
      childRow.className = 'child-container';
      childRow.style.display = 'none';
      parentElement.appendChild(childRow);

      const cell = document.createElement('td');
      cell.colSpan = 2;
      childRow.appendChild(cell);

      const nestedTable = document.createElement('table');
      cell.appendChild(nestedTable);
      renderTree(item.children, nestedTable, level + 1);

      row.querySelector('.toggle').addEventListener('click', function() {
        childRow.style.display = childRow.style.display === 'none' ? 'table-row' : 'none';
        this.textContent = this.textContent === '+' ? '-' : '+';
      });
    }
  });
}

// 初始化渲染
renderTree(treeData, document.getElementById('treeBody'));

Vue.js实现示例

利用Vue的递归组件特性更简洁地实现树状表格。

<template>
  <table>
    <thead><tr><th>名称</th></thead>
    <tbody>
      <tree-row v-for="node in treeData" :node="node" :key="node.name"></tree-row>
    </tbody>
  </table>
</template>

<script>
export default {
  components: {
    TreeRow: {
      template: `
        <tr>
          <td :style="{ paddingLeft: level * 20 + 'px' }">
            <span @click="toggle" v-if="hasChildren">{{ isOpen ? '-' : '+' }}</span>
            {{ node.name }}
          </td>
        </tr>
        <tr v-if="hasChildren && isOpen">
          <td :colspan="2">
            <table>
              <tree-row 
                v-for="child in node.children" 
                :node="child" 
                :level="level + 1"
                :key="child.name"
              ></tree-row>
            </table>
          </td>
        </tr>
      `,
      props: ['node', 'level'],
      data() {
        return { isOpen: false, level: this.level || 0 }
      },
      computed: {
        hasChildren() {
          return this.node.children && this.node.children.length
        }
      },
      methods: {
        toggle() { this.isOpen = !this.isOpen }
      }
    }
  },
  data() {
    return {
      treeData: [
        /* 同前文示例数据结构 */
      ]
    }
  }
}
</script>

关键注意事项

  • 数据格式:确保数据结构包含children字段表示嵌套关系
  • 性能优化:大数据量时建议使用虚拟滚动(如vue-virtual-scroller)
  • 样式控制:通过padding-left实现缩进视觉效果
  • 交互设计:展开/折叠状态需要本地存储时可结合localStorage

两种方式均可扩展添加复选框、懒加载等功能,框架实现通常更易于维护。

标签: 树状表格
分享给朋友:

相关文章

vue实现子表格

vue实现子表格

Vue 实现子表格的方法 在 Vue 中实现子表格可以通过多种方式完成,以下是几种常见的方法: 使用嵌套组件 创建一个父表格组件和一个子表格组件,通过 props 将数据传递给子表格组件。父表格的每…

用css制作表格

用css制作表格

使用CSS制作表格 CSS可以用来样式化HTML表格,使其更具视觉吸引力和功能性。以下是几种常见的方法: 基础表格样式 通过CSS可以调整表格的边框、间距和颜色: <table>…

国外vue实现表格控件

国外vue实现表格控件

以下是国外流行的 Vue 表格控件实现方案及特点,供参考: vue-good-table 基于 Vue 2/3 的轻量级表格组件,支持排序、分页、筛选等功能。 安装方式: npm instal…

css好看的表格制作

css好看的表格制作

使用CSS制作美观表格的方法 边框与间距优化 通过border-collapse属性合并边框,避免双边框效果。设置padding增加单元格内边距,提升可读性。 table { border-…

css制作表格

css制作表格

CSS 制作表格的方法 使用 CSS 可以灵活地创建和样式化表格,以下是几种常见的方法: 使用 HTML 表格标签结合 CSS 样式 通过 HTML 的 <table>、<tr&g…

vue实现导出表格

vue实现导出表格

Vue 实现导出表格的方法 使用 xlsx 库导出 Excel 安装 xlsx 库 npm install xlsx 在 Vue 组件中引入 xlsx import * as XLSX from…