我正在try 构建一个数据表,其中的每一行都可以展开/折叠.点击最左边的箭头,展开彩色内容,如下图所示.这工作得很好,但是展开部分的内容只有第一列那么宽.如何才能使展开的部分与整个表格一样宽(由红色箭头指示)?

我正在使用Shadcn-UI(https://ui.shadcn.com/docs/components/data-table).

enter image description here

以下是代码:

//page.tsx

import { DataTable } from "./data-table";
import { Row, columns } from "./columns";

export default async function CollapsibleTablePage() {
  const data: [Row] = [
    {
      column1: "Hi from outer column 1 and row 1",
      column2: "Hi from outer column 2 and row 1",
      collapsibleContent: "Hi from collapsible content and row 1",
    },
    {
      column1: "Hi from outer column 1 and row 2",
      column2: "Hi from outer column 2 and row 2",
      collapsibleContent: "Hi from collapsible content and row 2",
    },
    {
      column1: "Hi from outer column 1 and row 3",
      column2: "Hi from outer column 2 and row 3",
      collapsibleContent: "Hi from collapsible content and row 3",
    },
  ];

  return (
      <DataTable columns={columns} data={data} />
  );
}

//columns.tsx

"use client";

import { ColumnDef } from "@tanstack/react-table";
import { ChevronDown, Copy } from "lucide-react";
import { Button } from "@/components/shadcn/ui/button";
import { CollapsibleTrigger } from "@/components/shadcn/ui/collapsible";

export type Row = {
  column1: string;
  column2: string;
  collapsibleContent: string;
};

export const columns: ColumnDef<Row>[] = [
  {
    accessorKey: "column1",
    header: "column1",
    cell: ({ row }) => {
      return (
        <div className="flex items-center">
          <CollapsibleTrigger>
            <Button variant="ghost">
              <ChevronDown className="h-4 w-4" />
            </Button>
            {row.getValue("column1")}
          </CollapsibleTrigger>
        </div>
      );
    },
  },
  {
    accessorKey: "column2",
    header: "column2",
  },
];
//data-table.tsx

"use client";

import {
  ColumnDef,
  flexRender,
  getCoreRowModel,
  useReactTable,
} from "@tanstack/react-table";

import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/shadcn/ui/table";

import {
  Collapsible,
  CollapsibleContent,
} from "@/components/shadcn/ui/collapsible";
import React from "react";
import { Row } from "./columns";

interface DataTableProps<TData, TValue> {
  columns: ColumnDef<TData, TValue>[];
  data: TData[];
}

export function DataTable<TData, TValue>({
  columns,
  data,
}: DataTableProps<TData, TValue>) {
  const table = useReactTable({
    data,
    columns,
    getCoreRowModel: getCoreRowModel(),
  });

  var CollapsibleRowContent = ({ row }: { row: Row }) => (
    <div className="p-20">{row.collapsibleContent}</div>
  );

  return (
    <div>
      <Table>
        <TableHeader>
          {table.getHeaderGroups().map((headerGroup) => (
            <TableRow key={headerGroup.id}>
              {headerGroup.headers.map((header) => {
                return (
                  <TableHead key={header.id}>
                    {header.isPlaceholder
                      ? null
                      : flexRender(
                          header.column.columnDef.header,
                          header.getContext()
                        )}
                  </TableHead>
                );
              })}
            </TableRow>
          ))}
        </TableHeader>
        <TableBody>
          {table.getRowModel().rows.map((row) => (
            <Collapsible key={row.id} asChild>
              <>
                <TableRow>
                  {row.getVisibleCells().map((cell) => (
                    <TableCell key={cell.id}>
                      {flexRender(
                        cell.column.columnDef.cell,
                        cell.getContext()
                      )}
                    </TableCell>
                  ))}
                </TableRow>
                <CollapsibleContent className="bg-slate-700">
                  <CollapsibleRowContent row={row.original} />
                </CollapsibleContent>
              </>
            </Collapsible>
          ))}
        </TableBody>
      </Table>
    </div>
  );
}

推荐答案

因为它在<table>中,所以我们可以在<td>元素上使用colspan attribute来跨越多个列.

首先,我们使用the asChild prop:

<CollapsibleContent className="bg-slate-700" asChild>
  <tr>
    <CollapsibleRowContent row={row.original} />
  </tr>
</CollapsibleContent>

然后使用转换为colspan属性的colSpanprops 渲染<CollapsibleRowContent>中的<td>:

var CollapsibleRowContent = ({ row }: { row: Row }) => (
  <td colSpan={2}>
    <div className="p-20">{row.collapsibleContent}</div>
  </td>
);

this Stackblitz project分钟后开始工作

Css相关问答推荐

视频嵌入在Bootstrap 5轮播中没有响应扩展

如何使用css创建带有曲线的自定义按钮

如何让CSS过渡应用时宽度增加,而不是减少?

在ReactJS中使用动画在栅格上添加柱

设置ScaleImageButton的样式

两列网格中左列第一个文本正下方的按钮

如何将动态参数从react tsx文件发送到css

图像占用尽可能多的空间但保持宽高比并包含在窗口高度中

如何在真实文本旁边制作文本阴影,使其看起来像 css 中的重复文本?

如何根据 CSS 变量内容做一些事情?

停止 div 推动另一个 div 做出react

Angular 导航栏问题

将复选框对齐到中心

你可以在 CSS 中扩展实体(entity)吗?

修复导航栏隐藏页面内容

css中的背景图像没有被缓存

css3比例周围的空白

如何在 Firefox 和 Opera 中zoom HTML 元素?

如何在 Chrome 的判断器中添加/插入之前或之后的伪元素?

CSS垂直对齐不适用于浮动