メインコンテンツへスキップ
BlueAI
ホーム/コンポーネント/データ表示/データテーブル DataTable

DataTable

データテーブルコンポーネント。列定義・ページネーション・インライン編集をサポート。

|
import { DataTable } from "@blueai/ui"

Examples

Basic
請求番号取引先金額ステータス
INV-0042株式会社サンプル¥385,000入金済
INV-0041テスト商事¥128,700下書き
INV-0040ABC Holdings¥1,540,000期限超過
INV-0039グローバル・テック¥264,000下書き
INV-0038ネクスト・デザイン¥792,000入金済
const columns: DataTableColumn<Invoice>[] = [
  {
    header: "請求番号",
    cell: (row) => <span className="font-mono">{row.id}</span>,
  },
  { header: "取引先", cell: (row) => row.client },
  { header: "金額", cell: (row) => row.amount },
  {
    header: "ステータス",
    cell: (row) => <Badge variant="success">入金済</Badge>,
  },
];

<DataTable columns={columns} data={data} rowKey={(row) => row.id} />
Empty
請求番号取引先金額ステータス
データがありません
<DataTable
  columns={columns}
  data={[]}
  rowKey={(_, i) => String(i)}
  emptyMessage="データがありません"
/>
Inline Editable
品目数量単価小計
デザインレビュー
2
50000
100,000
コーディング
5
80000
400,000
テスト
3
40000
120,000
const columns: DataTableColumn<LineItem>[] = [
  { header: "品目", key: "name", editable: true },
  { header: "数量", key: "quantity", editable: true, align: "right", mono: true },
  { header: "単価", key: "unitPrice", editable: true, align: "right", mono: true },
  {
    header: "小計",
    cell: (row) => (Number(row.quantity) * Number(row.unitPrice)).toLocaleString(),
    align: "right",
  },
];

<DataTable
  columns={columns}
  data={items}
  rowKey={(row) => row.id}
  onCellChange={(rowIndex, key, value) => {
    setItems(prev => prev.map((item, i) =>
      i === rowIndex ? { ...item, [key]: value } : item
    ));
  }}
  onRowDelete={(rowIndex) => setItems(prev => prev.filter((_, i) => i !== rowIndex))}
  onRowDuplicate={(rowIndex) => { /* duplicate logic */ }}
  onAddRow={() => setItems(prev => [...prev, newItem()])}
  addRowLabel="+ 明細を追加"
/>

Props

PropTypeDefaultDescription
columns*DataTableColumn<T>[]列定義 { header, cell?, key?, editable?, format?, mono?, width?, align? }
data*T[]表示データ
rowKey*(row: T, index: number) => string各行の一意キーを返す関数
loadingbooleanローディング状態
emptyMessagestringデータなし時のメッセージ
paginationDataTablePaginationページネーション設定
onCellChange(rowIndex: number, key: string, value: string) => voidインライン編集時のコールバック

ガイドライン

Do
  • ページネーションで表示件数を制限する
  • 主要カラムを左側に配置する
Don't
  • 横スクロール必須になるほどカラムを増やさない
  • 全データを一括表示しない(パフォーマンス低下の原因)

Types

DataTableColumn<T>

type DataTableColumn<T> = {
  header: string;
  cell?: (row: T) => ReactNode;
  key?: string;
  editable?: boolean;
  format?: "number";
  mono?: boolean;
  width?: string;
  align?: "left" | "center" | "right";
};