Deutsch

Erfahren Sie, wie das automatische Batching von React mehrere Zustandsaktualisierungen optimiert, die Anwendungsleistung verbessert und unnötige Re-Renders verhindert. Entdecken Sie Beispiele und Best Practices.

React Automatisches Batching: Optimierung von Zustandsaktualisierungen für die Leistung

Die Leistung von React ist entscheidend für die Erstellung flüssiger und reaktionsschneller Benutzeroberflächen. Eine der wichtigsten Funktionen zur Verbesserung der Leistung ist das automatische Batching. Diese Optimierungstechnik gruppiert automatisch mehrere Zustandsaktualisierungen in einem einzigen Re-Render, was zu erheblichen Leistungssteigerungen führt. Dies ist besonders relevant in komplexen Anwendungen mit häufigen Zustandsänderungen.

Was ist React Automatisches Batching?

Batching ist im Kontext von React der Prozess, mehrere Zustandsaktualisierungen in einer einzigen Aktualisierung zu gruppieren. Vor React 18 wurde Batching nur auf Aktualisierungen angewendet, die innerhalb von React-Ereignis-Handlern auftraten. Aktualisierungen außerhalb von Ereignis-Handlern, wie z. B. innerhalb von setTimeout, Promises oder nativen Ereignis-Handlern, wurden nicht gebatcht. Dies konnte zu unnötigen Re-Renders und Leistungsengpässen führen.

React 18 führte automatisches Batching ein, das diese Optimierung auf alle Zustandsaktualisierungen ausweitet, unabhängig davon, wo sie auftreten. Das bedeutet, dass React alle Zustandsaktualisierungen automatisch zu einem einzigen Re-Render zusammenfasst, egal ob sie innerhalb eines React-Ereignis-Handlers, eines setTimeout-Callbacks oder einer Promise-Auflösung stattfinden.

Warum ist automatisches Batching wichtig?

Automatisches Batching bietet mehrere wichtige Vorteile:

Wie automatisches Batching funktioniert

React erreicht automatisches Batching, indem es die Ausführung von Zustandsaktualisierungen bis zum Ende des aktuellen Ausführungskontexts verzögert. Dies ermöglicht es React, alle Zustandsaktualisierungen zu sammeln, die während dieses Kontexts aufgetreten sind, und sie zu einem einzigen Update zusammenzufassen.

Betrachten Sie dieses vereinfachte Beispiel:

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>
  );
}

Vor React 18 würde das Klicken auf die Schaltfläche zwei Re-Renders auslösen: einen für setCount1 und einen weiteren für setCount2. Mit automatischem Batching in React 18 werden beide Zustandsaktualisierungen zusammengefasst, was zu nur einem Re-Render führt.

Beispiele für automatisches Batching in Aktion

1. Asynchrone Aktualisierungen

Asynchrone Operationen, wie z. B. das Abrufen von Daten von einer API, beinhalten oft das Aktualisieren des Zustands nach Abschluss der Operation. Automatisches Batching stellt sicher, dass diese Zustandsaktualisierungen zusammengefasst werden, auch wenn sie innerhalb des asynchronen Callbacks auftreten.

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>;
}

In diesem Beispiel werden sowohl setData als auch setLoading innerhalb der asynchronen Funktion fetchData aufgerufen. React fasst diese Aktualisierungen zusammen, was zu einem einzigen Re-Render führt, sobald die Daten abgerufen und der Ladezustand aktualisiert wurde.

2. Promises

Ähnlich wie bei asynchronen Aktualisierungen beinhalten Promises oft das Aktualisieren des Zustands, wenn das Promise aufgelöst oder abgelehnt wird. Automatisches Batching stellt sicher, dass auch diese Zustandsaktualisierungen zusammengefasst werden.

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>;
}

In diesem Fall werden entweder setResult und setError(null) bei Erfolg oder setError und setResult(null) bei Misserfolg aufgerufen. Unabhängig davon kombiniert automatisches Batching diese zu einem einzigen Re-Render.

3. Native Event-Handler

Manchmal müssen Sie möglicherweise native Event-Handler (z. B. addEventListener) anstelle der synthetischen Event-Handler von React verwenden. Automatisches Batching funktioniert auch in diesen Fällen.

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>;
}

Auch wenn setScrollPosition innerhalb eines nativen Event-Handlers aufgerufen wird, fasst React die Aktualisierungen weiterhin zusammen, wodurch übermäßige Re-Renders beim Scrollen des Benutzers verhindert werden.

Abmelden vom automatischen Batching

In seltenen Fällen möchten Sie sich möglicherweise vom automatischen Batching abmelden. Beispielsweise möchten Sie möglicherweise eine synchrone Aktualisierung erzwingen, um sicherzustellen, dass die Benutzeroberfläche sofort aktualisiert wird. React bietet die flushSync-API für diesen Zweck.

Hinweis: Die Verwendung von flushSync sollte sparsam erfolgen, da dies die Leistung beeinträchtigen kann. Im Allgemeinen ist es am besten, sich wann immer möglich auf automatisches Batching zu verlassen.

import { flushSync } from 'react-dom';

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

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

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

In diesem Beispiel erzwingt flushSync, dass React den Zustand sofort aktualisiert und die Komponente neu rendert, wodurch automatisches Batching umgangen wird.

Best Practices zur Optimierung von Zustandsaktualisierungen

Während automatisches Batching erhebliche Leistungsverbesserungen bietet, ist es dennoch wichtig, Best Practices zur Optimierung von Zustandsaktualisierungen zu befolgen:

Automatisches Batching und globale Überlegungen

Automatisches Batching, als eine zentrale React-Leistungsoptimierung, kommt Anwendungen weltweit zugute, unabhängig vom Standort des Benutzers, der Netzwerkgeschwindigkeit oder dem Gerät. Die Auswirkungen können jedoch in Szenarien mit langsameren Internetverbindungen oder weniger leistungsstarken Geräten deutlicher sein. Berücksichtigen Sie für ein internationales Publikum folgende Punkte:

Fazit

React Automatisches Batching ist eine leistungsstarke Optimierungstechnik, die die Leistung Ihrer React-Anwendungen erheblich verbessern kann. Durch die automatische Gruppierung mehrerer Zustandsaktualisierungen in einem einzigen Re-Render reduziert es den Rendering-Overhead, verhindert inkonsistente Zustände und führt zu einer flüssigeren und reaktionsschnelleren Benutzererfahrung. Indem Sie verstehen, wie automatisches Batching funktioniert, und Best Practices zur Optimierung von Zustandsaktualisierungen befolgen, können Sie leistungsstarke React-Anwendungen erstellen, die Benutzern weltweit ein großartiges Benutzererlebnis bieten. Die Verwendung von Tools wie React DevTools hilft, die Leistungsprofile Ihrer Anwendung in verschiedenen globalen Umgebungen weiter zu verfeinern und zu optimieren.

React Automatisches Batching: Optimierung von Zustandsaktualisierungen für die Leistung | MLOG