表格

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 的表格

適用情境

管理後台裡列數非常多的表格,或想直接在表格裡編輯。比起外觀更重視功能