ホームページ > ウェブフロントエンド > jsチュートリアル > React Query (TanStack Query): React の効率的なデータ取得と状態管理

React Query (TanStack Query): React の効率的なデータ取得と状態管理

Mary-Kate Olsen
リリース: 2024-12-29 22:21:25
オリジナル
501 人が閲覧しました

React Query (TanStack Query): Efficient Data Fetching and State Management for React

React Query (TanStack Query): React 用の強力なデータ取得および状態管理ライブラリ

React Query (現在は TanStack Query と呼ばれています) は、React アプリケーション用の非常に人気のあるデータ取得および状態管理ライブラリです。データのフェッチ、キャッシュ、同期、ページネーションの複雑さを処理することで、リモート データの操作を簡素化します。 React Query は、API リクエストの作成、データの保存と更新、読み込み状態の管理に関わる手動プロセスの多くを抽象化します。

TanStack Query は、開発者が最小限のセットアップで React アプリケーションのサーバー状態を管理するのに役立ち、特に非同期操作を扱う場合にスムーズなユーザー エクスペリエンスを保証します。


1. React クエリ (TanStack クエリ) とは何ですか?

React Query は、データ取得 および 状態管理 ツールであり、React アプリケーションで サーバー側データ と対話するプロセスを簡素化するのに役立ちます。データのフェッチ、キャッシュ、同期、バックグラウンド更新を抽象化して管理します。

これは主に サーバー状態 を管理するために使用されます。これは、REST API、GraphQL、またはその他のデータ ソースからのデータなど、リモート サーバーまたは API から取得されるデータを指します。

主な機能:

  • 自動キャッシュ: React Query はフェッチされたデータを自動的にキャッシュするため、追加のネットワーク リクエストを行わずに後続のデータをより高速にフェッチできます。
  • 自動同期: ユーザーがページ間を切り替えたり、アプリに再度アクセスしたりした場合でも、クライアントとサーバーの間でデータの同期が維持されるようにします。
  • バックグラウンド取得: React Query はバックグラウンドでデータを自動的に再取得し、ユーザーが常に最新のデータを取得できるようにします。
  • ポーリングとページネーション: React Query は、すぐに使えるポーリングとページネーションをサポートしており、これらの一般的なタスクを簡素化します。

2. React Query の中心的な概念

1.クエリ

React Query のクエリは、サーバー (または外部データ ソース) からデータをフェッチするために使用されます。クエリは一意のキーによって識別され、React Query がデータのキャッシュと追跡に使用します。

例:

import { useQuery } from 'react-query';

function fetchPosts() {
  return fetch('https://jsonplaceholder.typicode.com/posts')
    .then((response) => response.json());
}

const Posts = () => {
  const { data, error, isLoading } = useQuery('posts', fetchPosts);

  if (isLoading) return <div>Loading...</div>;
  if (error) return <div>Error fetching posts</div>;

  return (
    <ul>
      {data.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
};
ログイン後にコピー
ログイン後にコピー
  • useQuery フックは、fetchPosts 関数を使用してデータを取得します。投稿文字列は一意のキーであり、React Query はフェッチされたデータをこのキーの下にキャッシュします。

2.突然変異

ミューテーションは、サーバー上のデータを変更または作成するために使用されます (POST、PUT、DELETE リクエストなど)。クエリと同様に、ミューテーションを追跡し、ミューテーションが成功した後に状態を自動的に更新できます。

例:

import { useMutation } from 'react-query';

function createPost(postData) {
  return fetch('https://jsonplaceholder.typicode.com/posts', {
    method: 'POST',
    body: JSON.stringify(postData),
    headers: { 'Content-Type': 'application/json' },
  }).then((response) => response.json());
}

const NewPost = () => {
  const mutation = useMutation(createPost);

  const handleCreatePost = async () => {
    await mutation.mutate({ title: 'New Post', body: 'This is a new post' });
  };

  return (
    <div>
      <button onClick={handleCreatePost}>Create Post</button>
      {mutation.isLoading ? <p>Creating post...</p> : null}
      {mutation.isError ? <p>Error creating post</p> : null}
      {mutation.isSuccess ? <p>Post created!</p> : null}
    </div>
  );
};
ログイン後にコピー
  • useMutation フックは、データの作成、更新、削除などの操作に使用されます。

3.キャッシング

React Query はクエリの結果を自動的にキャッシュします。このキャッシュにより、レンダリングが高速化され、サーバーへの重複したリクエストが回避されます。キャッシュされたデータは、クエリが再フェッチされると自動的に更新されます。

キャッシュ時間の設定や失効時間 (キャッシュされたデータが失効したとみなされるまでの時間) の指定など、アプリのニーズに合わせてキャッシュ動作をカスタマイズできます。

例:

const { data } = useQuery('posts', fetchPosts, {
  staleTime: 1000 * 60 * 5, // Cache is fresh for 5 minutes
  cacheTime: 1000 * 60 * 30, // Cache persists for 30 minutes
});
ログイン後にコピー

4.ページネーション

React Query は、ページネーションの組み込みサポートを提供します。カスタム ページと制限パラメータを使用してページ分割されたデータを取得でき、応答が適切にキャッシュされます。

例:

const fetchPage = (page) => fetch(`https://jsonplaceholder.typicode.com/posts?_page=${page}&_limit=10`)
  .then((res) => res.json());

const PaginatedPosts = () => {
  const [page, setPage] = React.useState(1);
  const { data, isLoading, isError } = useQuery(['posts', page], () => fetchPage(page));

  if (isLoading) return <div>Loading...</div>;
  if (isError) return <div>Error</div>;

  return (
    <div>
      <ul>
        {data.map((post) => (
          <li key={post.id}>{post.title}</li>
        ))}
      </ul>
      <button onClick={() => setPage((prev) => prev - 1)} disabled={page === 1}>
        Previous
      </button>
      <button onClick={() => setPage((prev) => prev + 1)}>Next</button>
    </div>
  );
};
ログイン後にコピー
  • useQuery フックは配列キー (['posts', page]) とともに使用され、ページ分割されたデータを取得します。

3. React Query (TanStack Query) のインストールとセットアップ

React Query を使用するには、react-query (TanStack Query) をインストールする必要があります。

npm install react-query
ログイン後にコピー

1. React Query Provider のセットアップ

アプリケーションで React Query を有効にするには、ルート コンポーネントを QueryClientProvider でラップして、アプリ全体に必要なコンテキストを提供する必要があります。

import { QueryClient, QueryClientProvider } from 'react-query';

const queryClient = new QueryClient();

const App = () => (
  <QueryClientProvider client={queryClient}>
    <YourApp />
  </QueryClientProvider>
);
ログイン後にコピー
  • QueryClient は React Query のコア オブジェクトです。アプリ内のすべてのクエリとミューテーションを管理します。

4. React Query の高度な機能

1.ページネーションと無限クエリ

React Query は、useInfiniteQuery によるページネーションと無限スクロールをサポートしており、無限のリストとページネーションを処理できます。

例:

import { useInfiniteQuery } from 'react-query';

function fetchPostsPage({ pageParam = 1 }) {
  return fetch(`https://jsonplaceholder.typicode.com/posts?_page=${pageParam}`)
    .then((res) => res.json());
}

const InfinitePosts = () => {
  const {
    data,
    fetchNextPage,
    hasNextPage,
    isLoading,
    isFetchingNextPage,
  } = useInfiniteQuery('posts', fetchPostsPage, {
    getNextPageParam: (lastPage, allPages) => lastPage.length === 10 ? allPages.length + 1 : false,
  });

  return (
    <div>
      {isLoading ? <div>Loading...</div> : null}
      {data?.pages.map((page, i) => (
        <div key={i}>
          {page.map((post) => (
            <p key={post.id}>{post.title}</p>
          ))}
        </div>
      ))}
      <button onClick={() => fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage}>
        {isFetchingNextPage ? 'Loading more...' : hasNextPage ? 'Load More' : 'No more posts'}
      </button>
    </div>
  );
};
ログイン後にコピー

2.クエリの無効化

queryClient.invalidateQueries を使用してクエリを手動で無効にできます。これにより、指定されたクエリ キーのデータが強制的に再取得されます。

例:

import { useQuery } from 'react-query';

function fetchPosts() {
  return fetch('https://jsonplaceholder.typicode.com/posts')
    .then((response) => response.json());
}

const Posts = () => {
  const { data, error, isLoading } = useQuery('posts', fetchPosts);

  if (isLoading) return <div>Loading...</div>;
  if (error) return <div>Error fetching posts</div>;

  return (
    <ul>
      {data.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
};
ログイン後にコピー
ログイン後にコピー
  • これにより、新しい投稿を作成した後、投稿のリストが自動的に再取得されます。

5. React Query を使用する利点

1.簡素化されたデータ取得

React Query は、読み込み、成功、エラーの状態を処理するための定型文を削減し、データのフェッチをより簡単かつ宣言的にします。

2.自動キャッシュ

取得されたデータはデフォルトでキャッシュされるため、不必要なネットワーク リクエストが削減され、アプリが高速化されます。

3.バックグラウンド更新

React Query はバックグラウンドでのデータ取得を提供し、明示的に再取得されない場合でもアプリのデータを常に最新の状態に保ちます。

4.組み込みのページネーションと無限のクエリ

React Query の組み込みフックを使用すると、ページネーションと無限スクロールの処理が簡単かつ効率的になります。

5.デバッグ用の DevTools

React Query は、クエリ、ミューテーション、およびそれらの状態をリアルタイムで検査するための優れた DevTools インターフェイスを提供します。


**6.結論

**

React Query (TanStack Query) は、React アプリケーションでのデータ取得と状態管理を処理する効率的かつスケーラブルな方法を提供します。 React Query は、キャッシュ、バックグラウンドでのフェッチ、ページネーション、エラー処理を内蔵しており、サーバー側のデータを簡単かつシームレスに操作できます。


以上がReact Query (TanStack Query): React の効率的なデータ取得と状態管理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート