Maison >interface Web >js tutoriel >Réagissez aux nouveautés, pourquoi c'est important et conseils de migration

Réagissez aux nouveautés, pourquoi c'est important et conseils de migration

Patricia Arquette
Patricia Arquetteoriginal
2024-12-19 19:39:09681parcourir

React  What’s New, Why It Matters, and Migration Tips

C'est reparti : un autre article sur les nouvelles fonctionnalités de React ?. Mais honnêtement, celui-ci en vaut la peine. React 19 est officiellement passé de sa Release Candidate (RC), lancée en avril 2024, à sa version stable, remplie de mises à jour puissantes ! Des améliorations de performances aux nouveaux hooks et outils, React 19 offre quelque chose pour tout le monde, qu'il s'agisse de créer de petites applications ou de solutions d'entreprise.

Plongeons dans les nouveautés, avec des exemples de code et des conseils de migration pour vous aider à mettre à niveau vos projets en toute transparence.

Quoi de neuf dans React 19

1. Optimisations des performances

React 19 présente :

  • Améliorations sélectives de l'hydratation : optimise l'hydratation des applications rendues par le serveur en hydratant uniquement certaines parties de l'interface utilisateur selon les besoins.
  • Taille du bundle plus petite : la bibliothèque de React 19 est plus légère, ce qui entraîne des temps de chargement plus rapides et une utilisation réduite du réseau.

Exemple : hydratation efficace

import { hydrateRoot } from 'react-dom/client';
import App from './App';

const container = document.getElementById('root');
hydrateRoot(container, <App />);

2. Crochets nouveaux et améliorés

a. useFormStatus : gestion simplifiée de l'état des formulaires

Les formulaires sont plus faciles à gérer grâce au nouveau hook useFormStatus. Il suit l'état en attente d'un formulaire sans nécessiter de contexte personnalisé ni de forage d'accessoires.

import { useFormStatus } from 'react-dom';

function SubmitButton() {
  const { pending } = useFormStatus();
  return <button type="submit" disabled={pending}>Submit</button>;
}

b. useDeferredValue : l'option initialValue

Le hook useDeferredValue mis à jour garantit des transitions d'interface utilisateur plus fluides en rendant une valeur de repli initiale lors du traitement des données différées.

import { useDeferredValue } from 'react';

function Search({ deferredValue }) {
  const value = useDeferredValue(deferredValue, '');

  return <Results query={value} />;
}

c. useOptimistic : gérer les mises à jour optimistes

Le nouveau hook useOptimistic simplifie les mises à jour optimistes de l'interface utilisateur.

import { useOptimistic } from 'react';

function LikeButton() {
  const [optimisticLikes, setOptimisticLikes] = useOptimistic(0);

  function handleLike() {
    setOptimisticLikes(prev => prev + 1);
    fetch('/api/like', { method: 'POST' });
  }

  return <button onClick={handleLike}>Likes: {optimisticLikes}</button>;
}

3. Levage des métadonnées du document

React 19 récupère automatiquement les métadonnées telles que et <méta> balises <head> rubrique.<br> </p> <pre class="brush:php;toolbar:false">import { hydrateRoot } from 'react-dom/client'; import App from './App'; const container = document.getElementById('root'); hydrateRoot(container, <App />); </pre> <h3> <strong>4. Références améliorées</strong> </h3> <ul> <li> <strong>Refs as Props</strong> : vous pouvez désormais transmettre des références en tant qu'accessoires directement aux composants de fonction.</li> <li> <strong>Fonctions de nettoyage des références</strong> : Semblable à useEffect, vous pouvez définir une logique de nettoyage pour les références. </li> </ul> <pre class="brush:php;toolbar:false">import { useFormStatus } from 'react-dom'; function SubmitButton() { const { pending } = useFormStatus(); return <button type="submit" disabled={pending}>Submit</button>; } </pre> <h3> <strong>5. Débogage et rendu simultané</strong> </h3> <ul> <li>Journaux d'erreurs améliorés dans React DevTools.</li> <li>Meilleure prise en charge du rendu simultané avec des fonctionnalités telles que le <strong>traitement automatique par lots</strong> et les <strong>transitions</strong>. </li> </ul> <pre class="brush:php;toolbar:false">import { useDeferredValue } from 'react'; function Search({ deferredValue }) { const value = useDeferredValue(deferredValue, ''); return <Results query={value} />; } </pre> <h2> <strong>Conseils de migration</strong> </h2> <p>La mise à niveau vers React 19 devrait être simple pour la plupart des projets, mais voici quelques conseils pour assurer une transition en douceur :</p> <h3> <strong>1. Mettez à jour vos dépendances</strong> </h3> <p>Assurez-vous de mettre à jour React et React DOM vers les dernières versions :<br> </p> <pre class="brush:php;toolbar:false">import { useOptimistic } from 'react'; function LikeButton() { const [optimisticLikes, setOptimisticLikes] = useOptimistic(0); function handleLike() { setOptimisticLikes(prev => prev + 1); fetch('/api/like', { method: 'POST' }); } return <button onClick={handleLike}>Likes: {optimisticLikes}</button>; } </pre> <h3> <strong>2. Recherchez les fonctionnalités obsolètes</strong> </h3> <p>React 19 a supprimé certaines API héritées. Consultez le journal des modifications de React 19 pour plus de détails sur les fonctionnalités obsolètes.</p> <h3> <strong>3. Tester les fonctionnalités simultanées</strong> </h3> <p>Si votre projet utilise le rendu côté serveur ou des fonctionnalités simultanées, testez minutieusement votre application pour garantir la compatibilité avec les optimisations de React 19.</p> <h3> <strong>4. Utiliser de nouveaux crochets de manière incrémentielle</strong> </h3> <p>Commencez à adopter de nouveaux hooks comme useFormStatus ou useOptimistic dans des parties isolées de votre application avant de les déployer à grande échelle.</p> <h3> <strong>5. Mettre à jour la gestion des métadonnées</strong> </h3> <p>Si vous comptez sur une bibliothèque tierce pour la gestion des métadonnées, testez le fonctionnement du levage des métadonnées de React 19 avec votre configuration. Vous pourrez peut-être simplifier votre base de code en supprimant les dépendances inutiles.</p> <h3> <strong>6. Débogage et développement</strong> </h3> <p>Exploitez les React DevTools mis à jour pour le débogage. Si des erreurs se produisent lors de l'hydratation ou du rendu, React 19 fournit des journaux plus détaillés pour vous aider à résoudre les problèmes plus rapidement.</p> <h3> <strong>7. Préparez-vous au rendu simultané</strong> </h3> <p>Assurez-vous que vos composants gèrent correctement le rendu simultané. Par exemple :</p> <ul> <li>Évitez de vous fier à des comportements de rendu synchrone.</li> <li>Testez les mises à jour d'état au sein des transitions pour éviter les comportements inattendus.</li> </ul> <h2> <strong>Pourquoi réagir 19 est important</strong> </h2> <p>React 19 est plus qu'une simple mise à jour ; c'est un bond en avant en termes de performances, d'expérience de développement et de développement d'interface utilisateur moderne. Qu'il s'agisse de nouveaux hooks, d'une meilleure gestion des métadonnées ou d'améliorations du rendu simultané, cette version permet aux développeurs de créer de meilleures applications plus rapidement.</p> <h2> <strong>Pensées finales</strong> </h2> <p>Prêt à passer à React 19 ? Son encombrement réduit, ses fonctionnalités puissantes et ses outils de développement améliorés en font une évidence pour les applications React modernes. Utilisez les conseils de migration ci-dessus pour assurer une transition en douceur et commencer à explorer les nouvelles fonctionnalités de React 19.</p> <p>Pour plus de détails, consultez le billet de blog officiel de React 19. Faites-nous savoir votre nouvelle fonctionnalité préférée et comment React 19 a amélioré votre flux de travail de développement. Bon codage ! ?</p> <p>Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!</p></div><div class="nphpQianMsg"><a href="javascript:void(0);">define</a> <a href="javascript:void(0);">if</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);">function</a> <a href="javascript:void(0);">dom</a> <a href="javascript:void(0);">this</a> <a href="javascript:void(0);">transition</a> <a href="javascript:void(0);">ui</a><div class="clear"></div></div><div class="nphpQianSheng"><span>Déclaration:</span><div>Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn</div></div></div><div class="nphpSytBox"><span>Article précédent:<a class="dBlack" title="Comment effacer efficacement un canevas HTML5 pour le redessiner ?" href="https://m.php.cn/fr/faq/1796727314.html">Comment effacer efficacement un canevas HTML5 pour le redessiner ?</a></span><span>Article suivant:<a class="dBlack" title="Comment effacer efficacement un canevas HTML5 pour le redessiner ?" href="https://m.php.cn/fr/faq/1796727338.html">Comment effacer efficacement un canevas HTML5 pour le redessiner ?</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>Articles Liés</h2><em><a href="https://m.php.cn/fr/article.html" class="bBlack"><i>Voir plus</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/fr/faq/1609.html" title="Une analyse approfondie du composant de groupe de liste Bootstrap" class="aBlack">Une analyse approfondie du composant de groupe de liste Bootstrap</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/fr/faq/1640.html" title="Explication détaillée du currying de la fonction JavaScript" class="aBlack">Explication détaillée du currying de la fonction JavaScript</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/fr/faq/1949.html" title="Exemple complet de génération de mot de passe JS et de détection de force (avec téléchargement du code source de démonstration)" class="aBlack">Exemple complet de génération de mot de passe JS et de détection de force (avec téléchargement du code source de démonstration)</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/fr/faq/2248.html" title="Angularjs intègre l'interface utilisateur WeChat (weui)" class="aBlack">Angularjs intègre l'interface utilisateur WeChat (weui)</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/fr/faq/2351.html" title="Comment basculer rapidement entre le chinois traditionnel et le chinois simplifié avec JavaScript et l'astuce permettant aux sites Web de prendre en charge le basculement entre les compétences en chinois simplifié et traditionnel_javascript" class="aBlack">Comment basculer rapidement entre le chinois traditionnel et le chinois simplifié avec JavaScript et l'astuce permettant aux sites Web de prendre en charge le basculement entre les compétences en chinois simplifié et traditionnel_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>Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!</p></div><div class="footermid"><a href="https://m.php.cn/fr/about/us.html">À propos de nous</a><a href="https://m.php.cn/fr/about/disclaimer.html">Clause de non-responsabilité</a><a href="https://m.php.cn/fr/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>