Français

Découvrez comment le batching automatique de React optimise les mises à jour d'état multiples, améliorant les performances de l'application et évitant les re-rendus inutiles. Explorez des exemples et les meilleures pratiques.

Batching Automatique de React : Optimiser les Mises à Jour d'État pour la Performance

La performance de React est cruciale pour créer des interfaces utilisateur fluides et réactives. L'une des fonctionnalités clés introduites pour améliorer la performance est le batching automatique. Cette technique d'optimisation regroupe automatiquement plusieurs mises à jour d'état en un seul re-rendu, entraînant des gains de performance significatifs. Ceci est particulièrement pertinent dans les applications complexes avec des changements d'état fréquents.

Qu'est-ce que le Batching Automatique de React ?

Le batching, dans le contexte de React, est le processus de regroupement de plusieurs mises à jour d'état en une seule. Avant React 18, le batching n'était appliqué qu'aux mises à jour survenant à l'intérieur des gestionnaires d'événements de React. Les mises à jour en dehors des gestionnaires d'événements, comme celles dans setTimeout, les promesses ou les gestionnaires d'événements natifs, n'étaient pas groupées. Cela pouvait entraîner des re-rendus inutiles et des goulots d'étranglement de performance.

React 18 a introduit le batching automatique, qui étend cette optimisation à toutes les mises à jour d'état, quel que soit leur emplacement. Cela signifie que, que vos mises à jour d'état se produisent à l'intérieur d'un gestionnaire d'événements React, d'un rappel setTimeout ou d'une résolution de promesse, React les regroupera automatiquement en un seul re-rendu.

Pourquoi le Batching Automatique est-il Important ?

Le batching automatique offre plusieurs avantages clés :

Comment Fonctionne le Batching Automatique

React réalise le batching automatique en retardant l'exécution des mises à jour d'état jusqu'à la fin du contexte d'exécution actuel. Cela permet à React de collecter toutes les mises à jour d'état qui se sont produites pendant ce contexte et de les regrouper en une seule mise à jour.

Considérez cet exemple simplifié :

function ExampleComponent() {
  const [count1, setCount1] = useState(0);
  const [count2, setCount2] = useState(0);

  function handleClick() {
    setTimeout(() => {
      setCount1(count1 + 1);
      setCount2(count2 + 1);
    }, 0);
  }

  return (
    <div>
      <p>Count 1: {count1}</p>
      <p>Count 2: {count2}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

Avant React 18, cliquer sur le bouton déclencherait deux re-rendus : un pour setCount1 et un autre pour setCount2. Avec le batching automatique dans React 18, les deux mises à jour d'état sont regroupées, ce qui n'entraîne qu'un seul re-rendu.

Exemples de Batching Automatique en Action

1. Mises à Jour Asynchrones

Les opérations asynchrones, telles que la récupération de données depuis une API, impliquent souvent la mise à jour de l'état après la fin de l'opération. Le batching automatique garantit que ces mises à jour d'état sont regroupées, même si elles se produisent à l'intérieur du rappel asynchrone.

function DataFetchingComponent() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    async function fetchData() {
      try {
        const response = await fetch('https://api.example.com/data');
        const jsonData = await response.json();
        setData(jsonData);
        setLoading(false);
      } catch (error) {
        console.error('Error fetching data:', error);
        setLoading(false);
      }
    }

    fetchData();
  }, []);

  if (loading) {
    return <p>Loading...</p>;
  }

  return <div>Data: {JSON.stringify(data)}</div>;
}

Dans cet exemple, setData et setLoading sont toutes deux appelées dans la fonction asynchrone fetchData. React regroupera ces mises à jour, ce qui n'entraînera qu'un seul re-rendu une fois les données récupérées et l'état de chargement mis à jour.

2. Promesses

Similaires aux mises à jour asynchrones, les promesses impliquent souvent la mise à jour de l'état lorsque la promesse est résolue ou rejetée. Le batching automatique garantit que ces mises à jour d'état sont également regroupées.

function PromiseComponent() {
  const [result, setResult] = useState(null);
  const [error, setError] = useState(null);

  useEffect(() => {
    const myPromise = new Promise((resolve, reject) => {
      setTimeout(() => {
        const success = Math.random() > 0.5;
        if (success) {
          resolve('Promise resolved!');
        } else {
          reject('Promise rejected!');
        }
      }, 1000);
    });

    myPromise
      .then((value) => {
        setResult(value);
        setError(null);
      })
      .catch((err) => {
        setError(err);
        setResult(null);
      });
  }, []);

  if (error) {
    return <p>Error: {error}</p>;
  }

  if (result) {
    return <p>Result: {result}</p>;
  }

  return <p>Loading...</p>;
}

Dans ce cas, soit setResult et setError(null) sont appelés en cas de succès, soit setError et setResult(null) sont appelés en cas d'échec. Quoi qu'il en soit, le batching automatique combinera ces appels en un seul re-rendu.

3. Gestionnaires d'Événements Natifs

Parfois, vous pourriez avoir besoin d'utiliser des gestionnaires d'événements natifs (par exemple, addEventListener) au lieu des gestionnaires d'événements synthétiques de React. Le batching automatique fonctionne également dans ces cas.

function NativeEventHandlerComponent() {
  const [scrollPosition, setScrollPosition] = useState(0);

  useEffect(() => {
    function handleScroll() {
      setScrollPosition(window.scrollY);
    }

    window.addEventListener('scroll', handleScroll);

    return () => {
      window.removeEventListener('scroll', handleScroll);
    };
  }, []);

  return <p>Scroll Position: {scrollPosition}</p>;
}

Même si setScrollPosition est appelé à l'intérieur d'un gestionnaire d'événements natif, React regroupera toujours les mises à jour, empêchant ainsi des re-rendus excessifs lorsque l'utilisateur fait défiler la page.

Désactiver le Batching Automatique

Dans de rares cas, vous pourriez vouloir désactiver le batching automatique. Par exemple, vous pourriez vouloir forcer une mise à jour synchrone pour vous assurer que l'interface utilisateur est mise à jour immédiatement. React fournit l'API flushSync à cette fin.

Note : L'utilisation de flushSync doit être faite avec parcimonie, car elle peut avoir un impact négatif sur les performances. Il est généralement préférable de s'appuyer sur le batching automatique chaque fois que possible.

import { flushSync } from 'react-dom';

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

  function handleClick() {
    flushSync(() => {
      setCount(count + 1);
    });
  }

  return (<button onClick={handleClick}>Increment</button>);
}

Dans cet exemple, flushSync force React à mettre à jour immédiatement l'état et à effectuer un nouveau rendu du composant, contournant ainsi le batching automatique.

Meilleures Pratiques pour Optimiser les Mises à Jour d'État

Bien que le batching automatique apporte des améliorations de performance significatives, il est toujours important de suivre les meilleures pratiques pour optimiser les mises à jour d'état :

Batching Automatique et Considérations Globales

Le batching automatique, étant une optimisation de performance centrale de React, bénéficie aux applications à l'échelle mondiale, quel que soit l'emplacement de l'utilisateur, la vitesse du réseau ou l'appareil. Cependant, son impact peut être plus perceptible dans des scénarios avec des connexions Internet plus lentes ou des appareils moins puissants. Pour un public international, considérez ces points :

Conclusion

Le batching automatique de React est une technique d'optimisation puissante qui peut améliorer de manière significative les performances de vos applications React. En regroupant automatiquement plusieurs mises à jour d'état en un seul re-rendu, il réduit la surcharge de rendu, prévient les états incohérents et conduit à une expérience utilisateur plus fluide et réactive. En comprenant comment fonctionne le batching automatique et en suivant les meilleures pratiques pour optimiser les mises à jour d'état, vous pouvez créer des applications React hautes performances qui offrent une excellente expérience utilisateur à travers le monde. L'utilisation d'outils comme les React DevTools aide à affiner et optimiser davantage les profils de performance de votre application dans divers contextes mondiaux.

Batching Automatique de React : Optimiser les Mises à Jour d'État pour la Performance | MLOG