当前位置:首页 > React

react实现表格展开

2026-01-26 19:51:17React

实现表格展开功能的方法

在React中实现表格展开功能可以通过多种方式完成,以下是几种常见的方法:

使用状态管理控制展开/折叠

通过React的useState钩子管理展开状态,动态渲染展开内容:

react实现表格展开

import React, { useState } from 'react';

function ExpandableTable() {
  const [expandedRows, setExpandedRows] = useState({});

  const toggleRow = (rowId) => {
    setExpandedRows(prev => ({
      ...prev,
      [rowId]: !prev[rowId]
    }));
  };

  const data = [
    { id: 1, name: 'Item 1', details: 'Details for Item 1' },
    { id: 2, name: 'Item 2', details: 'Details for Item 2' }
  ];

  return (
    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Action</th>
        </tr>
      </thead>
      <tbody>
        {data.map(item => (
          <React.Fragment key={item.id}>
            <tr>
              <td>{item.name}</td>
              <td>
                <button onClick={() => toggleRow(item.id)}>
                  {expandedRows[item.id] ? 'Collapse' : 'Expand'}
                </button>
              </td>
            </tr>
            {expandedRows[item.id] && (
              <tr>
                <td colSpan="2">{item.details}</td>
              </tr>
            )}
          </React.Fragment>
        ))}
      </tbody>
    </table>
  );
}

使用第三方表格库

许多流行的React表格库如react-tableMaterial-UIDataGrid都内置了展开功能:

react实现表格展开

import { useTable, useExpanded } from 'react-table';

function ReactTableExpandable({ columns, data }) {
  const {
    getTableProps,
    getTableBodyProps,
    headerGroups,
    rows,
    prepareRow,
    state: { expanded }
  } = useTable(
    { columns, data },
    useExpanded
  );

  return (
    <table {...getTableProps()}>
      <thead>
        {headerGroups.map(headerGroup => (
          <tr {...headerGroup.getHeaderGroupProps()}>
            {headerGroup.headers.map(column => (
              <th {...column.getHeaderProps()}>{column.render('Header')}</th>
            ))}
          </tr>
        ))}
      </thead>
      <tbody {...getTableBodyProps()}>
        {rows.map(row => {
          prepareRow(row);
          return (
            <React.Fragment key={row.id}>
              <tr {...row.getRowProps()}>
                {row.cells.map(cell => (
                  <td {...cell.getCellProps()}>{cell.render('Cell')}</td>
                ))}
              </tr>
              {row.isExpanded && (
                <tr>
                  <td colSpan={row.cells.length}>
                    {row.original.details}
                  </td>
                </tr>
              )}
            </React.Fragment>
          );
        })}
      </tbody>
    </table>
  );
}

使用CSS过渡动画

为展开效果添加平滑的动画过渡:

.expandable-content {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease-out;
}

.expandable-content.expanded {
  max-height: 500px; /* 或足够大的值 */
}

嵌套子表格实现

对于更复杂的数据结构,可以嵌套子表格:

function NestedTable({ data }) {
  const [expandedId, setExpandedId] = useState(null);

  return (
    <table>
      <tbody>
        {data.map(item => (
          <React.Fragment key={item.id}>
            <tr onClick={() => setExpandedId(expandedId === item.id ? null : item.id)}>
              <td>{item.name}</td>
              <td>{expandedId === item.id ? '▼' : '▶'}</td>
            </tr>
            {expandedId === item.id && item.subItems && (
              <tr>
                <td colSpan="2">
                  <table>
                    <tbody>
                      {item.subItems.map(subItem => (
                        <tr key={subItem.id}>
                          <td>{subItem.name}</td>
                          <td>{subItem.value}</td>
                        </tr>
                      ))}
                    </tbody>
                  </table>
                </td>
              </tr>
            )}
          </React.Fragment>
        ))}
      </tbody>
    </table>
  );
}

这些方法可以根据具体需求进行组合或调整,实现不同复杂度的表格展开功能。

标签: 表格react
分享给朋友:

相关文章

vue实现表格拖动列宽

vue实现表格拖动列宽

实现表格列宽拖动的核心思路 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖动逻辑。在表头列分隔线处添加可拖拽区域,拖动时动态修改列的宽度。 基础HTML结构示例…

vue实现子表格

vue实现子表格

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

css好看的表格制作

css好看的表格制作

CSS表格美化方法 边框与间距优化 使用border-collapse合并边框,避免双线边框。设置padding增加单元格内边距,提升可读性。 table { border-collapse:…

css怎么制作表格

css怎么制作表格

使用HTML和CSS创建表格 HTML提供<table>标签用于创建表格结构,结合CSS可以自定义样式。以下是基本实现方法: HTML结构 <table> <th…

网页表格制作css代码

网页表格制作css代码

基础表格样式 使用CSS为HTML表格添加基础样式,如边框、间距和背景色: table { width: 100%; border-collapse: collapse; margin:…

vue实现表格多行修改

vue实现表格多行修改

实现表格多行修改的方法 数据绑定与表格渲染 使用v-model绑定表格数据到Vue实例的data属性。通过v-for循环渲染表格行,并为每行数据添加编辑状态标识。 <template>…