0Pricing
React Academy · レッスン

非同期リソースのためのuse() Hook

React 19のuse() hookを使い、render中にpromiseとcontextを読み取ります。

「非同期リソースのためのuse() Hook」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

はじめに

このレッスンでは、React 19のuse()フックを使って、レンダー関数内でPromiseとコンテキストの値を直接読み取り、非同期データへのアクセスを簡単にします。

use()とは

use()は、レンダー関数内でリソース(PromiseまたはContext)を同期的に読み取るReact 19のフックです。Promiseが保留中の場合、コンポーネントはサスペンドし、最も近いSuspense境界がフォールバックを表示します。
import { use } from 'react';

function UserProfile({ userPromise }) {
  const user = use(userPromise); // suspends if pending
  return <h1>{user.name}</h1>;
}

Promiseをpropsとして渡す

React 19でよく使われるパターンは、Server ComponentがPromise(例:データベースクエリー)を作成してClient Componentに渡し、Client Componentがuse()で読み取る方法です。Suspense境界は上位のどこに配置しても構いません。
// Server Component
export default function Page() {
  const userPromise = fetchUser(1); // NOT awaited
  return (
    <Suspense fallback={<Spinner />}>
      <Profile userPromise={userPromise} />
    </Suspense>
  );
}

// Client Component
'use client';
export function Profile({ userPromise }) {
  const user = use(userPromise);
  return <p>{user.name}</p>;
}

データ取得におけるuse()とuseEffectの違い

データ取得にuseEffectを使う場合、ローディング状態やエラー状態を手動で管理する必要があります。Suspenseとuse()を使えば、こうした定型処理が不要になり、コンポーネント本体ではデータを同期的に取得するかのように読み取るだけで済みます。

Contextの読み取りにuse()を使用

use()では、useContextと同じようにコンテキストの値も読み取れます。異なる点は、use()は条件分岐やループの内部で条件付きに呼び出せることです。useContextはRules of Hooksに従う必要があります。
import { use } from 'react';
import { ThemeContext } from './ThemeContext';

function Button({ danger }) {
  if (danger) {
    const theme = use(ThemeContext); // conditional — allowed with use()!
    return <button style={{ color: theme.red }}>Delete</button>;
  }
  return <button>Click</button>;
}

ErrorBoundaryによるエラー処理

use()に渡したPromiseが拒否されると、Reactはエラーをスローします。コンポーネントをErrorBoundaryでラップして、エラーを捕捉し、フォールバックを表示します。
<ErrorBoundary fallback={<Error />}>
  <Suspense fallback={<Loading />}>
    <Profile userPromise={fetchUser(id)} />
  </Suspense>
</ErrorBoundary>

Client Componentsでのみuse()を使用

Promiseを扱うuse()はClient Componentsで動作します。Server Componentsではasync/awaitを直接使用するため、サーバー上でPromiseにuse()を使う必要はありません。

Promiseのキャッシュ

コンポーネントが再レンダリングされる場合、再フェッチを避けるには同じPromise参照を受け取る必要があります。コンポーネントの外部または安定した場所(サーバー、キャッシュ、状態)でPromiseを作成し、propsとして渡します。

use()によるストリーミング

use()とストリーミングSSRを組み合わせると、ReactはページのHTMLをストリームで送信し、Suspenseのフォールバックを表示してから、Promiseの解決時に解決済みのコンテンツをストリームで送信できます。これらはすべて1つのHTTP接続で行われます。

重複排除のための React.cache()

サーバー上では、React.cache()(または Next.js の unstable_cache)が、1回のレンダー中に同じ非同期関数への複数回の呼び出しを重複排除します。そのため、複数のコンポーネントが同じ promise を使用しても、データベースへのアクセスは1回だけになります。

確認問題

use(promise) が呼び出されたとき、promise がまだ pending の場合、Client Component はどうなりますか?

まとめ

use(promise) はレンダー中に非同期データを同期的に読み取り、pending の場合はサスペンドします。use(context) は useContext と異なり、条件付きで使用できます。読み込みには必ず Suspense を、エラーには ErrorBoundary を組み合わせてください。

次に学ぶこと

次のレッスン:**React Actions & useActionState** — Server Action と Client Action を定義し、pending 状態を扱いながらフォーム送信を処理します。

よくある質問

「非同期リソースのためのuse() Hook」レッスンは無料ですか?

はい。「非同期リソースのためのuse() Hook」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「非同期リソースのためのuse() Hook」で何を学びますか?

React 19のuse() hookを使い、render中にpromiseとcontextを読み取ります。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「非同期リソースのためのuse() Hook」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. React Server Componentsの基礎
  2. 非同期リソースのためのuse() Hook
  3. React ActionsとuseActionState
  4. 即時フィードバックのためのuseOptimistic
← React Academyに戻る