0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【React】TanStack QueryとTanStack Formについて

Posted at

TanStack Queryについて

TanStack Query(以前は “React Query” としても知られていた)は、サーバーから取得したデータ(サーバー・ステート)を扱うためのライブラリです。

■データ取得(fetching)・キャッシュ・自動リフェッチ・エラー処理・並列・依存・無限スクロールなどをサポート。
■「グローバル状態管理(Redux や Context など)ではなく、サーバーからのデータ取得・更新」を楽にすることが主目的。
■型推論や React 18 以降への対応も進んでいます。

どんな時に使うか

次のような状況で特に有用です:

■API からデータを取得し、その結果を UI に反映する必要がある(一覧表示・詳細表示など)
■同じデータを複数画面/複数コンポーネントで使い回したい(キャッシュしたい)
■データの取得中・エラー・再取得・バックグラウンド更新など “データ取得のライフサイクル” をちゃんと扱いたい
■無限スクロールやページング、依存クエリ(あるデータが取得できたら次のデータを取得)など複雑なパターン

sample.tsx
// 例:ユーザー一覧を取得して表示するコンポーネント
import React from 'react';
import { useQuery, QueryClient, QueryClientProvider } from '@tanstack/react-query';

// QueryClient をアプリのルートで用意
const queryClient = new QueryClient();

function UsersList() {
  const { data, isLoading, isError, error } = useQuery({
    queryKey: ['users'],
    queryFn: async () => {
      const res = await fetch('/api/users');
      if (!res.ok) {
        throw new Error('Network response was not OK');
      }
      return res.json();
    }
  });

  if (isLoading) {
    return <div>読み込み中…</div>;
  }

  if (isError) {
    return <div>エラー: { (error as Error).message }</div>;
  }

  return (
    <ul>
      {data.map((user: { id: number; name: string }) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

export function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <h1>ユーザー一覧</h1>
      <UsersList />
    </QueryClientProvider>
  );
}

このように、データ取得・ローディング表示・エラー表示・表示までがスムーズに処理できます。

TanStack Formについて

TanStack Form は、フォーム(入力フォーム)の状態管理・バリデーション・送信などを効率よく扱うライブラリです。

■型安全(TypeScript で強く型付け)・フレームワーク非依存(React だけでなく他のフレームワークにも対応)という特徴があります。
■ヘッドレス(UI をあまり束縛せず、自分でコンポーネントを作れる自由度が高い)なアプローチ。
■入力値、エラー、バリデーション状況、ネストされたフィールドや配列フィールドも扱いやすく作られています。

どんな時に使うか

■フォームを扱う時に次のようなニーズがある場合に特に役立ちます:
■多くの入力フィールドがあって、状態管理・バリデーション・送信ロジックが煩雑になってきた
■型安全を重視していて、入力オブジェクトの形を TypeScript で明確にしたい
■UI ライブラリとの連携や、複数のフィールド・配列フィールド・動的フィールドがあるフォームを扱いたい
■自作コンポーネントでフォーム構築をしていて、ライブラリに依存しすぎず、自分で構造をコントロールしたい

sample.tsx
import React from 'react';
import { useForm } from '@tanstack/react-form';

interface SignUpForm {
  username: string;
  email: string;
  age: number;
}

export function SignUp() {
  const form = useForm<SignUpForm>({
    defaultValues: {
      username: '',
      email: '',
      age: 0,
    },
    onSubmit: async ({ value }) => {
      // 送信処理
      console.log('送信データ:', value);
      alert(`ようこそ、${value.username}さん!`);
    },
  });

  return (
    <form onSubmit={form.handleSubmit}>
      <div>
        <label>ユーザー名</label>
        <input
          value={form.values.username}
          onChange={form.handlers.username}
        />
      </div>
      <div>
        <label>メールアドレス</label>
        <input
          value={form.values.email}
          onChange={form.handlers.email}
        />
      </div>
      <div>
        <label>年齢</label>
        <input
          type="number"
          value={form.values.age}
          onChange={form.handlers.age}
        />
      </div>
      <button type="submit">送信</button>
    </form>
  );
}

比較・使い分けのポイント

TanStack Query → データ取得・キャッシュ・更新(サーバーからのデータ管理)

TanStack Form → フォームの入力・検証・送信(クライアント側のユーザー入力管理)

■両方使うケースも多いです:たとえば「フォーム送信 → API に送る」ようなとき、フォーム側に TanStack Form、結果取得・更新側に TanStack Query が入ることがあります。

ただし、何でも導入すればいいというわけではなく、小規模で入力が少ないフォームなら既存のシンプルな手法で十分な場合もあります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?