Maison  >  Article  >  interface Web  >  Maîtriser les rendus React : comment éviter les pièges courants

Maîtriser les rendus React : comment éviter les pièges courants

DDD
DDDoriginal
2024-09-26 06:41:42715parcourir

Mastering React Re-renders: How to Avoid Common Pitfalls

1. Présentation

Imaginez ceci : vous venez de créer une application React élégante et riche en fonctionnalités, mais tout à coup, les performances commencent à chuter. Les boutons semblent lents, les mises à jour des données prennent trop de temps et vous ne comprenez pas pourquoi. Si cela vous semble familier, vous n'êtes pas seul. Les rendus React, lorsqu'ils sont mal gérés, sont souvent les coupables silencieux des problèmes de performances.

La maîtrise des rendus dans React est cruciale pour les développeurs Web qui souhaitent créer des applications efficaces et évolutives. Examinons en profondeur le fonctionnement des re-rendus de React et découvrons des stratégies pratiques pour optimiser les performances, éviter les pièges courants et transformer votre application React en une expérience ultra-rapide.

2. Comment fonctionnent les nouveaux rendus React ?

Le mécanisme de re-rendu de React est l’une de ses fonctionnalités les plus puissantes. Il permet à votre application de mettre à jour dynamiquement l'interface utilisateur en fonction du changement d'état ou d'accessoires. Cependant, s'il n'est pas optimisé, ce processus peut conduire à des rendus inutiles, entraînant une dégradation des performances.

En termes simples, React restitue à chaque fois :

  1. L'état d'un composant change.
  2. Un composant reçoit de nouveaux accessoires.
  3. Le composant parent est restitué.

Mais que se passe-t-il lorsqu'un composant est restitué trop souvent ? Le navigateur doit repeindre l'écran, ce qui entraîne des animations saccadées, des interactions lentes et des utilisateurs frustrés. Maintenant, demandez-vous : combien de fois votre application vous a-t-elle semblé lente et vous ne parvenez pas à mettre le doigt sur la raison ?

3. Pourquoi les rendus excessifs nuisent aux performances

Les rendus excessifs créent un effet domino, rendant l'ensemble de votre application lent. Chaque fois qu'un nouveau rendu se produit :

  1. React réconcilie les modifications avec le DOM virtuel.
  2. Il calcule les mises à jour minimales à apporter au DOM actuel.
  3. Le navigateur repeint l'écran.

Dans les petites applications, cela peut passer inaperçu. Mais dans les applications volumineuses, avec des composants profondément imbriqués et une gestion d'état complexe, même le plus petit rendu inutile peut entraîner un goulot d'étranglement en termes de performances.

Voici un exemple simple :

const UserList = ({ users }) => {
  return users.map(user => <div key={user.id}>{user.name}</div>);
};

// Inside a parent component:
<UserList users={users} />

Imaginez maintenant que cette UserList soit restituée à chaque fois que le composant parent est mis à jour, même lorsque les utilisateurs n'ont pas changé. C'est là que réside le problème. Comment pouvons-nous éviter de tels rendus inutiles ?

4. Pièges courants (et comment les éviter)

Piège 1 : Ne pas mémoriser les fonctions et les objets

Chaque fois qu'un composant parent effectue un nouveau rendu, il crée de nouvelles références de fonction et d'objet, même si les valeurs réelles n'ont pas changé. Cela entraîne un nouveau rendu inutile des composants enfants.

Action : utilisez les hooks useCallback et useMemo pour mémoriser des fonctions et des objets.

const ParentComponent = () => {
  const handleClick = useCallback(() => {
    // some function logic
  }, []);

  const userDetails = useMemo(() => ({ name: "Rajesh", age: 30 }), []);

  return <ChildComponent onClick={handleClick} details={userDetails} />;
};

Pourquoi ça marche : La mémorisation empêche la création de nouvelles références de fonctions et d'objets à chaque nouveau rendu, réduisant ainsi les rendus inutiles dans les composants enfants.

Piège 2 : Passer des fonctions ou des objets en ligne comme accessoires

Des fonctions ou objets en ligne sont créés à chaque fois qu'un composant est rendu, ce qui entraîne un nouveau rendu du composant récepteur, même si les valeurs réelles n'ont pas changé.

Action : Déclarez des fonctions et des objets en dehors du composant ou utilisez des hooks de mémorisation.

// Avoid this:
<ChildComponent onClick={() => console.log("clicked")} />

// Instead:
const handleClick = useCallback(() => console.log("clicked"), []);
<ChildComponent onClick={handleClick} />

Piège 3 : Ne pas utiliser React.memo

Certains composants sont de nature pure : ils restituent toujours le même résultat avec les mêmes accessoires. Pourtant, sans React.memo, ils seront toujours restitués lorsque leur composant parent le fera.

Action : enveloppez les composants fonctionnels avec React.memo pour éviter les nouveaux rendus inutiles.

const ChildComponent = React.memo(({ data }) => {
  return <div>{data.name}</div>;
});

Pourquoi ça marche : React.memo garantit que le composant n'est restitué que lorsque ses accessoires changent, évitant ainsi les rendus redondants.

5. Comment suivre et déboguer les re-rendus React

Vous êtes-vous déjà demandé : « Pourquoi mon composant est-il restitué ? » React DevTools fournit un excellent moyen de suivre les rendus et de comprendre où les choses ne vont pas.

  1. Activer « Mettre en surbrillance les mises à jour » : cela vous montre quels composants sont à nouveau rendus.
  2. Utilisez l'onglet « Profilateur » : il affiche les délais de rendu et aide à identifier les goulots d'étranglement.

Vous pouvez également utiliser des hooks personnalisés comme celui-ci pour enregistrer les nouveaux rendus :

const useWhyDidYouRender = (componentName, props) => {
  const previousProps = useRef(props);

  useEffect(() => {
    if (previousProps.current !== props) {
      console.log(`${componentName} re-rendered`);
      previousProps.current = props;
    }
  });
};

6. Meilleures pratiques pour optimiser les rendus React

1. Soulevez l'état en cas de besoin, pas toujours

Parfois, augmenter l'état à un composant supérieur entraîne des rendus inutiles des composants enfants. Au lieu de cela, gérez l’État localement autant que possible.

2. Use Key Wisely

When rendering lists, ensure each item has a stable, unique key prop. This helps React optimize re-renders by identifying which items have changed.

3. Avoid Re-rendering Unmounted Components

This can cause memory leaks and performance issues. Use the useEffect cleanup function to avoid re-renders in unmounted components.

useEffect(() => {
  return () => {
    // cleanup logic here
  };
}, []);

7. Summary: Master React Re-renders

In short, React re-renders can be a hidden source of performance issues, but with the right techniques, you can prevent unnecessary re-renders, keep your app fast, and ensure smooth user experiences.

  • Memoize functions and objects to avoid re-rendering child components.
  • Use React.memo to stop unnecessary re-renders in pure components.
  • Leverage React DevTools to track, understand, and debug performance bottlenecks.

8. Practical Application: Improving Performance with Intentional Re-renders

Next time you're optimizing a React app, think critically about each re-render. Are they necessary? What happens if you memoize this function? By applying these strategies, you’ll be writing leaner, faster React code and avoiding the common pitfalls that trip up even the most experienced developers.


Final Thought: Now that you've learned the ins and outs of React re-renders, go ahead and apply these optimizations to your own apps. You'll not only see better performance but also gain confidence in writing scalable, maintainable React code!


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!

Déclaration:
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