Quand utiliser React memo, useMemo et useCallback, avec des compteurs de rendus en direct. Plus forwardRef et ref en prop dans React 19, les modales avec createPortal, les labels avec useId et une liste virtuelle de 10,000 lignes.
Enveloppez un composant dans memo pour sauter les rendus quand ses props n'ont pas changé. Utilisez useCallback pour garder une prop fonction identique entre les rendus, et useMemo pour mettre en cache un objet ou un calcul lent. Ils ne servent qu'en combinaison avec memo ou face à un vrai coût. Mesurez d'abord avec le React Profiler ; les compteurs en direct ci-dessous montrent la différence.
Une ligne chacun
Les démos comptent de vrais rendus dans votre navigateur. Tapez dans chaque champ avec l'interrupteur désactivé puis activé, et observez les compteurs. La seconde moitié couvre les API de référence qui apparaissent à côté du travail de performance : refs, portals et identifiants.
useMemo appelle votre fonction et met en cache la valeur qu'elle renvoie. useCallback met en cache la fonction elle-même. useCallback(fn, deps) équivaut à useMemo(() => fn, deps).
Non. Comparer les props prend aussi du temps, et la plupart des rendus sont peu coûteux. Utilisez memo là où le Profiler montre un composant qui se rend souvent avec les mêmes props et prend un temps notable.
Dans React 19, les composants fonction acceptent ref comme une prop normale, donc le nouveau code n'a pas besoin de forwardRef. Il fonctionne toujours, et l'équipe React a annoncé qu'il sera déprécié dans une future version.
Une modale placée dans une carte avec overflow hidden ou un transform peut être coupée ou passer sous d'autres contenus. La rendre dans document.body avec createPortal évite les deux tout en la gardant dans votre arbre React.
Non. useId sert aux attributs d'accessibilité comme htmlFor et aria-describedby. Les clés doivent venir de vos données, par exemple un identifiant de base de données.
Quel outil pour quel problème
Tapez dans le champ. Sans memo, la liste se re-rend à chaque touche alors que ses props n'ont pas changé. Avec memo, elle se rend une seule fois.
Passer une fonction fléchée en ligne casse memo, car une nouvelle fonction est créée à chaque rendu. useCallback renvoie la même jusqu'à ce que ses dépendances changent.
Filtrer 20,000 produits à chaque rendu est du travail perdu quand seule une valeur sans rapport a changé. useMemo ne relance le filtre que lorsque products ou query changent.
Un parent ne peut pas passer ref à un composant fonction sauf si celui-ci la transmet. forwardRef fait passer la ref jusqu'à un vrai élément.
Depuis React 19, les composants fonction reçoivent ref comme n'importe quelle autre prop, donc forwardRef n'est plus nécessaire dans le nouveau code.
Un portal rend ses enfants dans un autre nœud du DOM, généralement document.body, pour qu'une modale échappe aux parents avec overflow hidden ou un z-index faible. Les événements React remontent toujours à travers l'arbre React.
useId fournit un identifiant unique identique entre le rendu serveur et le rendu navigateur, donc plusieurs copies du même composant de champ n'entrent jamais en conflit.
List ne rend que les lignes visibles plus quelques-unes en plus. Chaque ligne reçoit index et style ; style positionne la ligne et doit être appliqué. La démo à côté utilise la même idée, écrite à la main.
Vous créez des formulaires ? useId se marie bien avec
Liste rendue {n} fois ({count} éléments)
Envelopper la liste dans memo
Tapez ici
({n} rendus)
Utiliser useCallback
Petit
Moyen
Grand
Choisi : {x}
Mettre en cache avec useMemo
Filtrer les produits
Clic sans rapport ({n})
{matches} sur 20,000 correspondent. Le filtre a tourné {runs} fois ; la dernière exécution a pris {ms} ms.
Rechercher
Activer la recherche
Cette boîte a overflow hidden, et pourtant la modale couvre toute la fenêtre.
Ouvrir la modale
Démo de portal
J'ai été rendu dans document.body avec createPortal.
Fermer
Nous répondons sous un jour.
E-mail (encore)
Même composant, identifiant différent.
10,000 clients
Client {n}
10,000 lignes, mais seulement {n} sont dans le DOM en ce moment.
Commencer gratuitement · Sans carte bancaire