Rumah >hujung hadapan web >tutorial js >React v Keluaran Stabil dan Perkara Baharu

React v Keluaran Stabil dan Perkara Baharu

Linda Hamilton
Linda Hamiltonasal
2024-12-09 00:12:12840semak imbas

React v The Stable Release and What’s New

React 19 telah mendarat secara rasmi, membawakan banyak ciri baharu dan peningkatan yang memudahkan pembangunan dan meningkatkan prestasi aplikasi. Daripada pengurusan keadaan yang dipertingkatkan kepada penyepaduan sisi pelayan yang lebih baik, React 19 mempunyai sesuatu untuk semua orang.


Ciri Utama dalam React 19 :

1. Tindakan untuk Pengurusan Negeri Async Dipermudah

Mengurus operasi async seperti permintaan API sentiasa menjadi cabaran biasa dalam React. React 19 memperkenalkan Tindakan, yang mengautomasikan keadaan belum selesai, pengendalian ralat dan kemas kini yang optimistik.

Contoh: Penyerahan Borang Ringkas dengan Tindakan

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>
  );
}

Di sini, useActionState mengurus keadaan penyerahan dan pengendalian ralat untuk anda, menjadikan kod lebih bersih dan lebih mudah diselenggara.


2. Kemas Kini Optimis dengan penggunaanOptimistic

Kemas kini UI yang optimis membolehkan pengguna melihat perubahan serta-merta semasa permintaan async sedang dijalankan. Cangkuk useOptimistic baharu menjadikan corak ini mudah.

Contoh: Perubahan Nama Optimis

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 memastikan pengalaman pengguna yang lancar dengan menunjukkan kemas kini walaupun sebelum pelayan bertindak balas.


3. Pelaporan Ralat Dipertingkat untuk Ketidakpadanan Penghidratan

React 19 menambah baik pengendalian ralat, terutamanya untuk ralat penghidratan. Daripada ralat kabur, anda kini mendapat perbezaan terperinci kandungan tidak sepadan antara pelayan dan pelanggan.

Contoh: Perbezaan Ralat Penghidratan

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

Mesej yang jelas ini membantu pembangun nyahpepijat isu dengan cepat dan cekap.


4. Komponen Pelayan dan Tindakan Pelayan

Komponen Pelayan Bertindak balas (RSC) membenarkan komponen dipaparkan pada pelayan, meningkatkan prestasi. Tindakan Pelayan membolehkan panggilan fungsi async pada pelayan terus daripada Komponen Pelanggan.

Contoh: Menggunakan Tindakan Pelayan

// 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>
  );
}

Tindakan Pelayan menyelaraskan pengambilan dan memberikan data sisi pelayan dalam Komponen Pelanggan.


5. Metadata Asli dan Pengurusan Lembaran Gaya

React 19 kini menyokong , <link> dan <meta> tag secara asli, memudahkan pengurusan metadata dokumen.</p> <p><strong>Contoh: Metadata Dinamik dalam Komponen</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 memastikan teg ini dipaparkan dalam <head> bahagian secara automatik, meningkatkan SEO dan kebolehgunaan.</p> <p><strong>Contoh: Lembaran Gaya Terurus</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 memastikan helaian gaya dimuatkan dalam susunan yang betul dan sekali sahaja, walaupun dirujuk beberapa kali.</p> <hr> <h3> <strong>Kenapa Naik Taraf kepada React 19?</strong> </h3> <p>Ciri baharu React 19 mengurangkan kod boilerplate dengan ketara, meningkatkan prestasi aplikasi dan meningkatkan pengalaman pembangunan. Ciri seperti <strong>Tindakan</strong>, <strong>Kemas Kini Optimis</strong> dan <strong>Komponen Pelayan</strong> memperkasakan pembangun untuk membina aplikasi yang dinamik, responsif dan berskala dengan sedikit usaha.</p> <hr> <h3> <strong>Cara Menaik taraf</strong> </h3> <p>Ikuti Panduan Naik Taraf React 19 untuk peralihan yang lancar. Pastikan anda menguji dengan teliti dan menangani sebarang perubahan yang melanggar yang digariskan dalam panduan.</p> <hr> <p>React 19 ialah pengubah permainan, menggabungkan kesederhanaan, kuasa dan prestasi. Mula bereksperimen dengan ciri baharu ini dan tingkatkan projek React anda ke peringkat seterusnya!</p> <p>Atas ialah kandungan terperinci React v Keluaran Stabil dan Perkara Baharu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!</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>Kenyataan:</span><div>Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn</div></div></div><div class="nphpSytBox"><span>Artikel sebelumnya:<a class="dBlack" title="Bagaimanakah Saya Boleh Membekukan Pengepala Jadual HTML Menggunakan CSS dan JavaScript?" href="https://m.php.cn/ms/faq/1796713282.html">Bagaimanakah Saya Boleh Membekukan Pengepala Jadual HTML Menggunakan CSS dan JavaScript?</a></span><span>Artikel seterusnya:<a class="dBlack" title="Bagaimanakah Saya Boleh Membekukan Pengepala Jadual HTML Menggunakan CSS dan JavaScript?" href="https://m.php.cn/ms/faq/1796713306.html">Bagaimanakah Saya Boleh Membekukan Pengepala Jadual HTML Menggunakan CSS dan JavaScript?</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>Artikel berkaitan</h2><em><a href="https://m.php.cn/ms/article.html" class="bBlack"><i>Lihat lagi</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/ms/faq/1609.html" title="Analisis mendalam bagi komponen kumpulan senarai Bootstrap" class="aBlack">Analisis mendalam bagi komponen kumpulan senarai Bootstrap</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ms/faq/1640.html" title="Penjelasan terperinci tentang fungsi JavaScript kari" class="aBlack">Penjelasan terperinci tentang fungsi JavaScript kari</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ms/faq/1949.html" title="Contoh lengkap penjanaan kata laluan JS dan pengesanan kekuatan (dengan muat turun kod sumber demo)" class="aBlack">Contoh lengkap penjanaan kata laluan JS dan pengesanan kekuatan (dengan muat turun kod sumber demo)</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ms/faq/2248.html" title="Angularjs menyepadukan UI WeChat (weui)" class="aBlack">Angularjs menyepadukan UI WeChat (weui)</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ms/faq/2351.html" title="Cara cepat bertukar antara Cina Tradisional dan Cina Ringkas dengan JavaScript dan helah untuk tapak web menyokong pertukaran antara kemahiran_javascript Cina Ringkas dan Tradisional" class="aBlack">Cara cepat bertukar antara Cina Tradisional dan Cina Ringkas dengan JavaScript dan helah untuk tapak web menyokong pertukaran antara kemahiran_javascript Cina Ringkas dan Tradisional</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>Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!</p></div><div class="footermid"><a href="https://m.php.cn/ms/about/us.html">Tentang kita</a><a href="https://m.php.cn/ms/about/disclaimer.html">Penafian</a><a href="https://m.php.cn/ms/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><!-- Matomo --><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://tongji.php.cn/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '9']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!-- End Matomo Code --></html>