SJ blog
frontend
S

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

React 19の新機能と変更点まとめ

React 19で導入されたActions・useActionState・use()・ref as prop・Server Actionsなど主要な新機能を実例コードで解説します。

一言結論

React 19のActionsとuseActionStateはフォームの非同期処理に必要だったボイラープレートを大幅に削減し、use()フックとref as propの変更はコンポーネント設計をよりシンプルに書けるよう根本から改善された。

React 19 の主な新機能

React 19 は 2024年12月に正式リリースされました。フォーム処理・非同期処理・Serverコンポーネントまわりが大きく改善されています。

Actions — 非同期処理の新しい書き方

React 19 では、フォームの送信や非同期ミューテーションを処理する「Actions」というパターンが公式サポートされました。

// 従来のパターン
const [isPending, setIsPending] = useState(false);
const [error, setError] = useState(null);

async function handleSubmit(e) {
  e.preventDefault();
  setIsPending(true);
  try {
    await submitForm(formData);
  } catch (err) {
    setError(err.message);
  } finally {
    setIsPending(false);
  }
}
// React 19 の useActionState
import { useActionState } from "react";

async function submitAction(prevState, formData) {
  try {
    await submitForm(formData);
    return { success: true };
  } catch (err) {
    return { error: err.message };
  }
}

function Form() {
  const [state, action, isPending] = useActionState(submitAction, null);

  return (
    <form action={action}>
      <input name="email" />
      <button disabled={isPending}>
        {isPending ? "送信中..." : "送信"}
      </button>
      {state?.error && <p>{state.error}</p>}
    </form>
  );
}

use() — Promise とコンテキストの読み取り

use() は Hooks のルール(コンポーネントのトップレベルのみ)から解放された新しい API です。

import { use, Suspense } from "react";

// Promise を直接 use() で読む
function UserProfile({ userPromise }) {
  const user = use(userPromise); // Suspense がフォールバックを処理
  return <div>{user.name}</div>;
}

// Context を条件分岐の中で読む
function Component({ show }) {
  if (show) {
    const theme = use(ThemeContext); // 条件分岐の中でも使える
    return <div style={{ color: theme.color }}>...</div>;
  }
  return null;
}

ref が prop として渡せるように

forwardRef が不要になりました。

// 以前
const Input = forwardRef((props, ref) => <input ref={ref} {...props} />);

// React 19 から — ref を普通の prop として受け取れる
function Input({ ref, ...props }) {
  return <input ref={ref} {...props} />;
}

// 使う側
<Input ref={myRef} />

useOptimistic — 楽観的 UI 更新

import { useOptimistic, useTransition } from "react";

function LikeButton({ liked, count, onLike }) {
  const [optimisticLiked, setOptimistic] = useOptimistic(liked);
  const [_, startTransition] = useTransition();

  function handleClick() {
    startTransition(async () => {
      setOptimistic(!optimisticLiked); // UI を即時更新
      await onLike(); // サーバーリクエスト(失敗したら巻き戻る)
    });
  }

  return (
    <button onClick={handleClick}>
      {optimisticLiked ? "❤️" : "🤍"} {count}
    </button>
  );
}

Document Metadata のサポート

コンポーネントの中に <title><meta> を書けるようになり、react-helmet などが不要になりました。

function BlogPost({ post }) {
  return (
    <>
      <title>{post.title} | TechBlog</title>
      <meta name="description" content={post.description} />
      <article>{post.content}</article>
    </>
  );
}

Stylesheet の優先度管理

function Component() {
  return (
    <>
      <link rel="stylesheet" href="/theme.css" precedence="default" />
      <link rel="stylesheet" href="/override.css" precedence="high" />
      <div>...</div>
    </>
  );
}

まとめ

React 19 は フォーム処理と非同期ミューテーションまわりの DX が大幅に改善されました。useActionStateuse()useOptimistic の3つが特に実用的で、ボイラープレートを大幅に削減できます。forwardRef の廃止も歓迎されるシンプル化です。


参考: React 19 公式ブログ