【React】useTableの使い方

image

この記事は、【可茂IT塾 Advent Calendar 2024】の16日目の記事です。

はじめに

皆さんもweb開発をしている時にテーブルを作成したくなる時があると思います。CSSを頑張っていじって作るのもありかもしれませんが、どうせなら楽をしたいということで今回はuseTableの基本的な使い方を紹介しようと思います。

環境

  • React v18.3.1
  • typeScript v5.6.2
  • vite v6.0.3

実装

パッケージのインストール

まずはそれぞれの環境に合ったパッケージ管理ツールでパッケージをインストールします。 今回の環境ではnpmを使用しているのでnpmのやり方でインストールしようと思います。

npm install @tanstack/react-table

列定義

次に列定義をしていきます。 テーブルコアからヘルパー関数を呼び出して定義していきましょう。

import { createColumnHelper } from "@tanstack/react-table";

type Person = {
  firstName: string;
  lastName: string;
  info: {
    age: number;
    gender: string;
  };
};

const columnHelper = createColumnHelper<Person>();

const columns = [
  columnHelper.accessor("firstName", {
    header: "First Name",
    footer: (props) => props.column.id,
  }),
  columnHelper.accessor("lastName", {
    header: "Last Name",
    footer: (props) => props.column.id,
  }),
  columnHelper.accessor("info.age", {
    header: "Age",
    footer: (props) => props.column.id,
  }),
    // Custom Header
  columnHelper.accessor("info.gender", {
    header: () => <span>Gender</span>,
    footer: (props) => props.column.id,
  })

headerには基本的に文字列を渡しますが、無名関数を宣言してhtml文法を返り値として返すこともできます。


データを定義

次にテーブルとして表示するデータを定義していきます。これはカラムで定義した型と同じならAPIなどで取得したデータも表示できます。

type Person = {
  firstName: string;
  lastName: string;
  info: {
    age: number;
    gender: string;
  };
};

const defaultData: Person[] = [
  { firstName: "John", lastName: "Doe", info: { age: 18, gender: "Men" } },
  { firstName: "Jane", lastName: "Fonda", info: { age: 20, gender: "Men" } },
  { firstName: "Alice", lastName: "Smith", info: { age: 23, gender: "Women" } },
];

Tableインスタンスの作成

データとカラムを定義したのでテーブルを表示したい関数の中でインスタンスを作成していきます。

function App() {
  const [data, _setData] = useState<Person[]>(() => [...defaultData]);
  const table = useReactTable<Person>({
    data,
    columns,
    getCoreRowModel: getCoreRowModel(),
  });
  
  return (
    <>
    </>
  );
}

export default App;

今回はstateでdataを状態管理しているのでset関数で中身を変えるとtableのデータを更新することもできます。


テーブルの表示

まずはヘッダを表示します。返り値としてテーブルタグの中にヘッドタグを置き、その中でmap関数をぶん回します。

...
<div className="p-2">
      <table>
        <thead>
          {table.getHeaderGroups().map((headerGroups) => (
            <tr key={headerGroups.id}>
              {headerGroups.headers.map((header) => (
                <th key={headerGroups.id}>
                  {header.isPlaceholder
                    ? null
                    : flexRender(
                        header.column.columnDef.header,
                        header.getContext()
                      )}
                </th>
              ))}
            </tr>
          ))}
        </thead>
      </table>
    </div>

これでテーブルのヘッダが表示されるようになりました。

header

次に実際のデータを表示していきましょう。


return (
    <div className="p-2">
      <table>
        <thead>
          {table.getHeaderGroups().map((headerGroups) => (
            <tr key={headerGroups.id}>
              {headerGroups.headers.map((header) => (
                <th key={headerGroups.id}>
                  {header.isPlaceholder
                    ? null
                    : flexRender(
                        header.column.columnDef.header,
                        header.getContext()
                      )}
                </th>
              ))}
            </tr>
          ))}
        </thead>
        <tbody>
          {table.getRowModel().rows.map((row) => (
            <tr key={row.id}>
              {row.getVisibleCells().map((cell) => (
                <td key={cell.id}>
                  {flexRender(cell.column.columnDef.cell, cell.getContext())}
                </td>
              ))}
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );

これで基本的なテーブルを表示することができました。

body

また、Tableインスタンスを複数作り、データやカラムを変えることで同じコードの中で様々なテーブルを同時に表示することができます。

さらに、インスタンスを作成する際に関数を渡すことで、ソートをしたりカスタムの更新をすることができます。

まとめ

テーブルを作成するときにCSSを頑張っていじっていた方もuseTableを使いたくなったでしょうか? 私もまだ理解しきれていないのでこれからたくさん使って上手く使えるようになりましょう。 最後まで読んでいただきありがとうございました。

参考

https://tanstack.com/

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More

タグ

Flutter (115)初心者向け (28)イベント (18)Google Apps Script (15)Nextjs (12)可茂IT塾 (9)Firebase (7)React (7)riverpod (6)ChatGPT (5)vscode (5)デザイン (5)新卒 (4)就活 (4)Figma (4)Dart (4)JavaScript (4)お知らせ (4)FlutterWeb (3)Prisma (3)NestJS (3)Slack (3)TypeScript (3)ワーケーション (3)インターン (3)設計 (2)線型計画法 (2)事例 (2)Git (2)Image (2)File (2)Material Design (2)経験談 (2)画像 (2)iOS (2)アプリ開発 (2)React Hooks (2)tailwindcss (2)社会人 (2)大学生 (2)RSS (1)Google (1)Web (1)CodeRunner (1)個人開発 (1)Android (1)Unity (1)WebView (1)Twitter (1)フルリモート (1)TextScaler (1)textScaleFactor (1)学生向け (1)supabase (1)Java (1)Spring Boot (1)shell script (1)正規表現 (1)table (1)テーブル (1)hooks (1)react (1)パワーポイント (1)趣味 (1)モンスターボール (1)CSS (1)SCSS (1)Cupertino (1)ListView (1)就活浪人 (1)既卒 (1)保守性 (1)iPad (1)シェアハウス (1)スクレイピング (1)PageView (1)画面遷移 (1)flutter_hooks (1)Gmail (1)GoogleWorkspace (1)ShaderMask (1)google map (1)Google Places API (1)GCPコンソール (1)Google_ML_Kit (1)Vercel (1)Google Domains (1)DeepLeaning (1)深層学習 (1)Google Colab (1)コード生成 (1)GitHub Copilot (1)オンラインオフィス (1)オブジェクト指向 (1)クラスの継承 (1)ポリモーフィズム (1)LINE (1)Bitcoin (1)bitFlyer (1)コミュニティー (1)文系エンジニア (1)Freezed (1)ヒーター (1)作業効率 (1) (1)Flutter実践開発 (1) (1)permission_handler (1)flutter_local_notifications (1)markdown (1)GlobalKey (1)ValueKey (1)Key (1)アイコン (1)go_router (1)FireStorage (1)debug (1)datetime_picker (1)Apple Store Connect (1)FlutterGen (1)デバッグ (1)Widget Inspector (1)VRChat (1)API (1)検索機能 (1)Shader (1)Navigator (1)メール送信 (1)FlutterFlow (1)Firebase App Distribution (1)Fastlane (1)Dio (1)CustomClipper (1)ClipPath (1)カスタム認証 (1)アニメーション (1)Arduino (1)ESP32 (1)フリーランス (1)会社員 (1)mac (1)csv (1)docker (1)GithubActions (1)Dialog (1)BI (1)LifeHack (1)ショートカット (1)Chrome (1)高校生 (1)キャリア教育 (1)非同期処理 (1)生体認証 (1)BackdropFilter (1)レビュー (1)getAuth (1)クローズドテスト (1)PlayConsole (1)Algolia (1)コンサルティング (1)Symbol (1)

お知らせ

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More
U30可茂ITインターンハッカソン

U30可茂ITインターンハッカソン

12月28,29日開催。2日間でアプリ開発の企画から完成までを目指す!U30可茂ITインターンハッカソンを開催します。

Read More