SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

フロントエンド開発における定番ライブラリ「React」の最新バージョン解説

フロントエンドの定番ライブラリ「React 19」の新機能を紹介──新しいAPI

フロントエンド開発における定番ライブラリ「React」の最新バージョン解説 第4回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 前回は、React 19の新機能のうち非同期データ更新に関わるものを紹介しました。今回は前回紹介できなかった新しいAPIについて紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

対象読者

  • 新バージョンでReactを体験してみたい方
  • すでにReact開発に従事していて、新機能を知りたい方
  • Reactの最新動向を追っておきたい方

 なお、本記事はReact 18で導入された「トランジション」や「Suspense」に関して基本知識があることを前提としています。

前提環境

 記事のサンプルコードは、以下の環境で動作を確認しています。

  • Ubuntu 22.04
  • React 19.0.0
  • Node.js v22.7.0
  • Google Chrome 130.0.6723.92

 サンプルコードを実行するには、サンプルのフォルダーでnpm installコマンドを実行してライブラリーをダウンロードした後、npm startコマンドを実行し、 https://localhost:3000 をWebブラウザーで表示します。本記事内ではReact 19の新機能に関する本質的な部分を抽出して説明するので、それ以外の実装は各サンプルコードを参照してください。

「アクション」に関連した新しいフック(1)

 前回紹介したuseActionState<form>アクション以外にも、React 19では「アクション」に関連した新しいAPIが追加されています。

useOptimisticフック:楽観的更新を簡潔に実現

 React 19に新しく追加されたuseOptimisticフックは、その名の通り「楽観的(Optimistic)な更新」を容易に実装するためのものです。

 「楽観的な更新」というのは、「処理に失敗する可能性は低いので、とりあえず画面表示は更新してしまおう」という戦略のことで、ユーザー体験を向上させることが目的です。基本的には以下の流れになります。

  • (1)少し時間のかかる処理がある
  • (2)処理前に画面表示を期待値にしておく
  • (3:処理成功時)処理完了後の値を反映する
  • (3:処理失敗時)表示を処理前の値に戻す

 こういった動きを実現するためには、処理前後の値・期待値の管理や失敗時のロールバック、成功時の値復元など、意外と複雑な処理が必要になります。これをなるべく容易に実現できるようにしたものがuseOptimisticフックです。

 では前回作成したUpdateTitleコンポーネントに「楽観的な更新」を追加してみましょう。

[リスト1]useOptimisticで楽観的にした例 ※ファイル名:01_react19-data-update-useoptimistic/src/index.jsx
function UpdateTitle({ value, onUpdate }) {
  // useOptimisticで楽観的なステートと更新関数を取得 ... (1)
  const [optimisticTitle, setOptimisticTitle] = useOptimistic(value);

  const [error, submitAction, isPending] = useActionState(
    async (previousState, formData) => {
      const value = formData.get("title");
      // 楽観的な更新を行う ... (2)
      setOptimisticTitle(value);
      const { data, error } = await updateTitle(value);
      if (!error) {
        onUpdate(data);
      }
      return error;
    },
    null //ステートの初期値
  );

  return (
    <form action={submitAction}>
      <input name="title" defaultValue={value} disabled={isPending} />
      <button type="submit" disabled={isPending}>
        更新
      </button>
      {error && <p>{error}</p>}
      <div>値: {value}</div>
      {/* 楽観的な state を表示する ... (3) */}
      <div>楽観的な値: {optimisticTitle}</div>
    </form>
  );
}

 (1)でuseOptimisticを使い、stateと更新関数を取得しています。このステートは「楽観的なstate」と呼ばれます。

 (2)で実際の処理前にステート更新関数を呼び出し、optimisticTitleを「楽観的に」期待値へ更新します。画面に表示するステートはoptimisticTitleを指定します((3))。

楽観的更新の例
楽観的更新の例

 valueを直接表示している上のほうの値は、非同期関数の完了まで更新されませんが、楽観的なstateであるoptimisticTitleはボタンを押した直後に更新されます。さらに、非同期関数が成功の場合(errorでなかった場合)はそのまま維持されますが、失敗した場合(errorがある場合;たとえば外部APIとの通信に失敗した場合)は変更前の値に戻ります。

楽観的更新の例(失敗時は自動で値が元に戻る)
楽観的更新の例(失敗時は自動で値が元に戻る)

 このようにuseOptimisticを介すだけで「楽観的更新」が実現できます。注目すべきは「変更前の値」も「変更前の値に戻す処理」も「処理完了後の値を反映する処理」も管理する必要がない点です。

[コラム]useOptimisticの使いどころ

 いつでも「楽観的更新」が望ましいかというと、そうとも言えません。ここではフォームによる値更新を例に挙げましたが、更新後の値を即座に反映することでユーザーに「更新できた」と誤認させてしまう可能性があります。

 「いいねボタン」や「メッセージアプリ」のように、「処理後の状態がフロントエンド側で予測可能」かつ「即時反映されないと体感を損なう」ユースケースで有効なアプローチです。

次のページ
「アクション」に関連した新しいフック(2)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
フロントエンド開発における定番ライブラリ「React」の最新バージョン解説連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山田 研二(ヤマダ ケンジ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。個人紹介主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著者記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook<個人紹介>株式会社MSEN CTO。高校卒業後、大阪大学の研究所で働きながらプログラミングやWebデザインをはじめ、以後20年以上、Webサイト制作や業務システムの構築を手がけています。フリーソフトもいくつか公開しています。好きな言語はC#とTypeScript、趣味は旅行です。 GitHub アカウント

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20822 2025/01/29 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング