React v 安定版リリースと新機能

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-09 00:12:12789ブラウズ

React v The Stable Release and What’s New

React 19 が正式にリリースされ、開発を簡素化し、アプリケーションのパフォーマンスを向上させる豊富な新機能と拡張機能が導入されました。状態管理の改善からサーバー側の統合の改善まで、React 19 は誰にとっても役立つものを備えています。


React 19 の主な機能:

1.簡素化された非同期状態管理のためのアクション

API リクエストのような非同期操作の管理は、React における常に共通の課題でした。 React 19 では、保留状態、エラー処理、オプティミスティック更新を自動化する アクション が導入されています。

例:

を使用した簡略化されたフォーム送信アクション

import { useActionState } from "react";

function UpdateNameForm() {
  const [error, submitAction, isPending] = useActionState(
    async (prevState, formData) => {
      const name = formData.get("name");
      const error = await updateName(name);
      if (error) {
        return error;
      }
      redirect("/profile");
      return null;
    },
    null
  );

  return (
    <form action={submitAction}>
      <input type="text" name="name" />
      <button type="submit" disabled={isPending}>
        Update
      </button>
      {error && <p>{error}</p>}
    </form>
  );
}

ここで、useActionState は送信状態とエラー処理を管理し、コードをクリーンにして保守しやすくします。


2. useOptimistic を使用したオプティミスティック更新

オプティミスティック UI 更新により、ユーザーは非同期リクエストの進行中に変更をすぐに確認できます。新しい useOptimistic フックにより、このパターンが簡単になります。

例: 楽観的な名前の変更

import { useOptimistic } from "react";

function ChangeName({ currentName, onUpdateName }) {
  const [optimisticName, setOptimisticName] = useOptimistic(currentName);

  const submitAction = async (formData) => {
    const newName = formData.get("name");
    setOptimisticName(newName); // Show optimistic state
    const updatedName = await updateName(newName); // Wait for the async request
    onUpdateName(updatedName); // Update the actual state
  };

  return (
    <form action={submitAction}>
      <p>Your name: {optimisticName}</p>
      <input type="text" name="name" />
      <button type="submit">Change Name</button>
    </form>
  );
}

useOptimistic は、サーバーが応答する前でも更新を表示することで、シームレスなユーザー エクスペリエンスを保証します。


3.水分補給の不一致に対するエラーレポートの強化

React 19 では、特にハイドレーション エラーのエラー処理が改善されています。あいまいなエラーの代わりに、サーバーとクライアント間の不一致コンテンツの詳細な差分を取得できるようになりました。

例: ハイドレーション誤差の差

Uncaught Error: Hydration failed because the server-rendered HTML didn’t match the client.
Tree mismatch:
+ Client: <span>Welcome</span>
- Server: <span>Hello</span>

これらの明確なメッセージは、開発者が問題を迅速かつ効率的にデバッグするのに役立ちます。


4.サーバーコンポーネントとサーバーアクション

React Server Components (RSC) を使用すると、サーバー上でコンポーネントをレンダリングできるようになり、パフォーマンスが向上します。サーバー アクションを使用すると、クライアント コンポーネントから直接サーバー上の非同期関数を呼び出すことができます。

例: サーバー アクションの使用

// Server Component
export const fetchComments = async () => {
  const response = await fetch("/api/comments");
  return await response.json();
};

// Client Component
import { use } from "react";

function Comments({ commentsPromise }) {
  const comments = use(commentsPromise); // Suspends until resolved
  return (
    <ul>
      {comments.map((comment) => (
        <li key={comment.id}>{comment.text}</li>
      ))}
    </ul>
  );
}

// Usage
function App() {
  return (
    <Suspense fallback={<p>Loading comments...</p>}>
      <Comments commentsPromise={fetchComments()} />
    </Suspense>
  );
}

サーバー アクションは、クライアント コンポーネント内のサーバー側データの取得とレンダリングを効率化します。


5.ネイティブのメタデータとスタイルシートの管理

React 19 は、、<link>、<meta> をサポートするようになりました。ネイティブにタグを付け、ドキュメントのメタデータ管理を簡素化します。</p> <p><strong>例: コンポーネント内の動的メタデータ</strong><br> </p> <pre class="brush:php;toolbar:false">function BlogPost({ title, keywords }) { return ( <article> <h1>{title}</h1> <title>{title}</title> <meta name="keywords" content={keywords.join(", ")} /> <p>Content of the blog post...</p> </article> ); } </pre> <p>React では、これらのタグが <head> でレンダリングされるようにします。セクションが自動的に作成され、SEO と使いやすさが向上します。</p> <p><strong>例: マネージド スタイルシート</strong><br> </p> <pre class="brush:php;toolbar:false">import { useActionState } from "react"; function UpdateNameForm() { const [error, submitAction, isPending] = useActionState( async (prevState, formData) => { const name = formData.get("name"); const error = await updateName(name); if (error) { return error; } redirect("/profile"); return null; }, null ); return ( <form action={submitAction}> <input type="text" name="name" /> <button type="submit" disabled={isPending}> Update </button> {error && <p>{error}</p>} </form> ); } </pre> <p>React は、複数回参照された場合でも、スタイルシートが正しい順序で 1 回だけロードされるようにします。</p> <hr> <h3> <strong>React 19 にアップグレードする理由</strong> </h3> <p>React 19 の新機能により、定型コードが大幅に削減され、アプリケーションのパフォーマンスが向上し、開発エクスペリエンスが向上します。 <strong>アクション</strong>、<strong>オプティミスティックアップデート</strong>、<strong>サーバーコンポーネント</strong>などの機能により、開発者はより少ない労力で動的で応答性が高く、スケーラブルなアプリケーションを構築できます。</p> <hr> <h3> <strong>アップグレード方法</strong> </h3> <p>スムーズに移行するには、React 19 アップグレード ガイドに従ってください。徹底的にテストし、ガイドに記載されている重大な変更に対処してください。</p> <hr> <p>React 19 は、シンプルさ、パワー、パフォーマンスを兼ね備えた、革新的な製品です。これらの新機能の実験を開始して、React プロジェクトを次のレベルに引き上げてください!</p> <p>以上がReact v 安定版リリースと新機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。</p></div><div class="nphpQianMsg"><a href="javascript:void(0);">less</a> <a href="javascript:void(0);">for</a> <a href="javascript:void(0);">while</a> <a href="javascript:void(0);">Error</a> <a href="javascript:void(0);">using</a> <a href="javascript:void(0);">this</a> <a href="javascript:void(0);">transition</a> <a href="javascript:void(0);">ui</a> <a href="javascript:void(0);">SEO</a> <a href="javascript:void(0);">Game</a><div class="clear"></div></div><div class="nphpQianSheng"><span>声明:</span><div>この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。</div></div></div><div class="nphpSytBox"><span>前の記事:<a class="dBlack" title="CSS と JavaScript を使用して HTML テーブルのヘッダーを固定するにはどうすればよいですか?" href="https://m.php.cn/ja/faq/1796713282.html">CSS と JavaScript を使用して HTML テーブルのヘッダーを固定するにはどうすればよいですか?</a></span><span>次の記事:<a class="dBlack" title="CSS と JavaScript を使用して HTML テーブルのヘッダーを固定するにはどうすればよいですか?" href="https://m.php.cn/ja/faq/1796713306.html">CSS と JavaScript を使用して HTML テーブルのヘッダーを固定するにはどうすればよいですか?</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>関連記事</h2><em><a href="https://m.php.cn/ja/article.html" class="bBlack"><i>続きを見る</i><b></b></a></em><div class="clear"></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-6t+ed+2i-1n-4w" data-ad-client="ca-pub-5902227090019525" data-ad-slot="8966999616"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><ul class="nphpXgwzList"><li><b></b><a href="https://m.php.cn/ja/faq/1609.html" title="Bootstrap リスト グループ コンポーネントの詳細な分析" class="aBlack">Bootstrap リスト グループ コンポーネントの詳細な分析</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ja/faq/1640.html" title="JavaScript関数のカリー化の詳細説明" class="aBlack">JavaScript関数のカリー化の詳細説明</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ja/faq/1949.html" title="JS パスワードの生成と強度検出の完全な例 (デモ ソース コードのダウンロード付き)" class="aBlack">JS パスワードの生成と強度検出の完全な例 (デモ ソース コードのダウンロード付き)</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ja/faq/2248.html" title="Angularjs は WeChat UI (weui) を統合します" class="aBlack">Angularjs は WeChat UI (weui) を統合します</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ja/faq/2351.html" title="JavaScript を使用して繁体字中国語と簡体字中国語をすばやく切り替える方法と、簡体字中国語と繁体字中国語の切り替えをサポートする Web サイトのトリック_javascript スキル" class="aBlack">JavaScript を使用して繁体字中国語と簡体字中国語をすばやく切り替える方法と、簡体字中国語と繁体字中国語の切り替えをサポートする Web サイトのトリック_javascript スキル</a><div class="clear"></div></li></ul></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="5027754603"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><footer><div class="footer"><div class="footertop"><img src="/static/imghwm/logo.png" alt=""><p>福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!</p></div><div class="footermid"><a href="https://m.php.cn/ja/about/us.html">私たちについて</a><a href="https://m.php.cn/ja/about/disclaimer.html">免責事項</a><a href="https://m.php.cn/ja/update/article_0_1.html">Sitemap</a></div><div class="footerbottom"><p> © php.cn All rights reserved </p></div></div></footer><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body></html>