テーブル

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 もこれで作られている

AG Grid

公式 ↗

特徴

データを渡すだけで、並び替え・列の幅の変更・スクロールなどがそろった表ができる。Excel のような表に強い

向いている場面

管理画面などで、行がとても多い表や、表の中で編集したい。見た目より機能を重視する