Maison  >  Article  >  interface Web  >  Explorer l'utilisation de ReactCallback Hook : une plongée en profondeur

Explorer l'utilisation de ReactCallback Hook : une plongée en profondeur

PHPz
PHPzoriginal
2024-09-12 10:32:01619parcourir

Exploring React

Les applications React nécessitent des performances optimales, d'autant plus qu'elles augmentent en taille et en complexité. Dans notre article précédent, nous explorons useMemo, un crochet clé pour mémoriser les valeurs calculées et éviter les recalculs inutiles. Si vous n'êtes pas familier avec useMemo ou si vous souhaitez rafraîchir votre compréhension, « Comprendre useMemo de React » offre des informations précieuses pour améliorer votre compréhension et optimiser l'efficacité des applications. La consultation de cet article peut fournir une base solide et des conseils pratiques pour améliorer les performances.

Dans cet article, nous nous concentrerons sur useCallback, un hook frère de useMemo, et explorerons comment il contribue à l'optimisation de vos composants React. Alors que useMemo est généralement utilisé pour mémoriser les résultats de fonctions, useCallback est conçu pour mémoriser des fonctions entières. Examinons sa fonctionnalité et en quoi elle diffère de useMemo.

À quoi sert le rappel ?

À la base, useCallback est un hook React qui mémorise une fonction afin que la même instance de la fonction soit renvoyée à chaque rendu, tant que ses dépendances ne changent pas. Cela peut empêcher la recréation inutile de fonctions, ce qui est particulièrement utile lors de la transmission de fonctions en tant qu'accessoires aux composants enfants.

Voici un exemple de base :

import React, { useState, useCallback } from 'react';

function Parent() {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    console.log("Button clicked!");
  }, []);

  return (
    <div>
      <button onClick={handleClick}>Click me</button>
      <p>You've clicked {count} times</p>
    </div>
  );
}

Dans cet exemple, handleClick est mémorisé. Sans dépendances, il ne sera recréé que si le composant est démonté. Sans useCallback, cette fonction serait recréée à chaque rendu, même si sa logique reste inchangée.

En quoi useCallback est-il différent de useMemo ?

Pendant que useCallback mémorise une fonction, useMemo mémorise le résultat de l'exécution d'une fonction. Donc, si vous souhaitez uniquement éviter les calculs ou les opérations inutiles, useMemo pourrait être une meilleure solution. Cependant, si vous souhaitez éviter de transmettre une nouvelle référence de fonction à chaque rendu, useCallback est l'outil à utiliser.

Cas d'utilisation pour useCallback

  1. Éviter le nouveau rendu inutile des composants enfants Un scénario courant pour useCallback est celui où vous transmettez des fonctions en tant qu'accessoires aux composants enfants. React restitue les composants enfants si un accessoire change, y compris lorsqu'une nouvelle référence de fonction est passée. L'utilisation de useCallback garantit que la même instance de fonction est transmise à moins que ses dépendances ne changent.
import React, { useState, useCallback } from 'react';

function Child({ onClick }) {
  console.log("Child component rendered");
  return <button onClick={onClick}>Click me</button>;
}

export default function Parent() {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    console.log("Button clicked!");
  }, []);

  return (
    <div>
      <Child onClick={handleClick} />
      <button onClick={() => setCount(count + 1)}>Increase count</button>
    </div>
  );
}

Ici, la fonction handleClick est mémorisée, ce qui empêche le composant Enfant de restituer inutilement lorsque l'état du composant parent change. Sans useCallback, le composant Child serait restitué à chaque modification du parent, car une nouvelle référence de fonction serait transmise à chaque fois.

En quoi est-ce différent de useMemo ?

Dans un scénario similaire, useMemo serait utilisé si le résultat d'une logique de fonction (et non la fonction elle-même) devait être transmis à l'enfant. Par exemple, mémoriser un calcul coûteux pour éviter de recalculer à chaque rendu.

  1. Gestion des gestionnaires d'événements dans les listes Lors du rendu de listes de composants, useCallback est utile pour empêcher React de créer de nouveaux gestionnaires d'événements à chaque rendu.
import React, { useState, useCallback } from 'react';

function ListItem({ value, onClick }) {
  return <li onClick={() => onClick(value)}>{value}</li>;
}

export default function ItemList() {
  const [items] = useState([1, 2, 3, 4, 5]);

  const handleItemClick = useCallback((value) => {
    console.log("Item clicked:", value);
  }, []);

  return (
    <ul>
      {items.map(item => (
        <ListItem key={item} value={item} onClick={handleItemClick} />
      ))}
    </ul>
  );
}

Dans ce scénario, useCallback garantit que la fonction handleItemClick reste la même d'un rendu à l'autre, évitant ainsi une recréation inutile de la fonction pour chaque élément de la liste.

En quoi est-ce différent de useMemo ?

Si, au lieu de transmettre un gestionnaire d'événements, nous calculions le résultat en fonction des éléments (par exemple, la somme des valeurs dans la liste), useMemo serait mieux adapté. useMemo est utilisé pour mémoriser une valeur calculée, tandis que useCallback est strictement destiné aux fonctions.

Bonnes pratiques d'utilisationRappel

  1. Utilisez-le uniquement lorsque cela est nécessaire L’un des plus grands pièges de useCallback est d’en abuser. Si une fonction est simple et ne dépend pas de variables externes, il n'est peut-être pas nécessaire de la mémoriser. L’utilisation de useCallback ajoute inutilement de la complexité sans offrir un avantage significatif en termes de performances.
// Unnecessary use of useCallback
const simpleFunction = useCallback(() => {
  console.log("Simple log");
}, []);

Dans des cas comme celui-ci, il n'est pas nécessaire de mémoriser la fonction car il n'y a pas de dépendance ni de surcharge de calcul.

  1. Gardez les dépendances exactes Tout comme useMemo, useCallback s'appuie sur un tableau de dépendances pour déterminer quand la fonction mémorisée doit être mise à jour. Assurez-vous toujours que les dépendances reflètent avec précision les valeurs utilisées dans la fonction.
const handleClick = useCallback(() => {
  console.log("Clicked with count:", count);
}, [count]); // `count` is a dependency here

La fonction mémorisée utilisera des valeurs obsolètes si les dépendances nécessaires sont omises, ce qui entraînera des bugs potentiels.

Conclusion

useCallback et useMemo sont des outils inestimables pour l'optimisation des performances dans React, mais ils servent des objectifs différents. Utilisez useMemo lorsque vous devez mémoriser le résultat d'un calcul coûteux et utilisez useCallback lorsque vous devez vous assurer qu'une référence de fonction reste stable entre les rendus. En comprenant les distinctions et les cas d'utilisation de chacun, vous pouvez optimiser efficacement vos applications React.

Pour en savoir plus sur useMemo, assurez-vous de consulter l'article complet ici : Comprendre useMemo de React.

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