表格

TanStack Table / AG Grid

推荐

TanStack Table

容易和网站外观保持一致,并能与 shadcn/ui 搭配使用。如果表格有几万行,可以考虑 AG Grid

比较效果

用每个库做了同样的东西,动手试试看。

TanStack Table
AG Grid

比较代码

修改代码,右边的预览会跟着变化。

import {
  createColumnHelper,
  createSortedRowModel,
  rowSortingFeature,
  tableFeatures,
  useTable,
} from "@tanstack/react-table"

type Employee = { name: string; department: string; joined: number }

// 表格中显示的数据
const employees: Employee[] = [
  { name: "张伟", department: "销售", joined: 2019 },
  { name: "李娜", department: "研发", joined: 2021 },
  { name: "王芳", department: "研发", joined: 2023 },
  { name: "刘洋", department: "人事", joined: 2020 },
]

// 要使用的功能(排序)
const features = tableFeatures({
  rowSortingFeature,
  sortedRowModel: createSortedRowModel(),
})

// 列配置:每一列显示什么
const helper = createColumnHelper<typeof features, Employee>()
const columns = helper.columns([
  helper.accessor("name", { header: "姓名" }),
  helper.accessor("department", { header: "部门" }),
  helper.accessor("joined", { header: "入职年份" }),
])

export default function App() {
  const table = useTable({ features, columns, data: employees })

  return (
    <div className="overflow-hidden rounded-xl border bg-background">
    <table className="w-full text-sm">
      <thead>
        {table.getHeaderGroups().map((group) => (
          <tr key={group.id} className="bg-muted/50">
            {group.headers.map((header) => (
              <th
                key={header.id}
                onClick={header.column.getToggleSortingHandler()}
                className="cursor-pointer px-4 py-2.5 text-left font-medium text-muted-foreground select-none hover:text-foreground"
              >
                <table.FlexRender header={header} />
                {header.column.getIsSorted() === "asc" && " ▲"}
                {header.column.getIsSorted() === "desc" && " ▼"}
              </th>
            ))}
          </tr>
        ))}
      </thead>
      <tbody>
        {table.getRowModel().rows.map((row) => (
          <tr key={row.id} className="hover:bg-muted/30">
            {row.getAllCells().map((cell) => (
              <td
                key={cell.id}
                className="border-t px-4 py-2.5"
              >
                <table.FlexRender cell={cell} />
              </td>
            ))}
          </tr>
        ))}
      </tbody>
    </table>
    </div>
  )
}

比较

截至 2026 年 10 月

TanStack Table

推荐官方网站 ↗

特点

只负责排序、筛选等“计算”。<table> 和样式由自己来写,所以设计可以自由决定

适用场景

想做出与网站外观一致的表格,比如配合 shadcn/ui。shadcn/ui 的 Data Table 也是用它做的

特点

只要传入数据,就能得到带排序、调整列宽、滚动等功能的表格。擅长做类似 Excel 的表格

适用场景

管理后台中行数非常多的表格,或需要在表格里直接编辑。比起外观更看重功能