Nederlands

Ontdek hoe React's automatische batching meerdere state updates optimaliseert, de applicatieprestaties verbetert en onnodige re-renders voorkomt.

React Automatische Batching: Optimaliseren van State Updates voor Prestaties

De prestaties van React zijn cruciaal voor het creëren van soepele en responsieve gebruikersinterfaces. Een van de belangrijkste functies die zijn geïntroduceerd om de prestaties te verbeteren, is automatische batching. Deze optimalisatietechniek groepeert automatisch meerdere state updates in een enkele re-render, wat leidt tot aanzienlijke prestatiewinsten. Dit is vooral relevant in complexe applicaties met frequente state-wijzigingen.

Wat is React Automatische Batching?

Batching, in de context van React, is het proces van het groeperen van meerdere state updates in een enkele update. Vóór React 18 werd batching alleen toegepast op updates die plaatsvonden binnen React event handlers. Updates buiten event handlers, zoals die binnen setTimeout, promises of native event handlers, werden niet gebatchd. Dit kan leiden tot onnodige re-renders en prestatieknelpunten.

React 18 introduceerde automatische batching, dat deze optimalisatie uitbreidt naar alle state updates, ongeacht waar ze plaatsvinden. Dit betekent dat of uw state updates nu plaatsvinden binnen een React event handler, een setTimeout callback, of een promise-resolutie, React ze automatisch samenvoegt in een enkele re-render.

Waarom is Automatische Batching Belangrijk?

Automatische batching biedt verschillende belangrijke voordelen:

Hoe Automatische Batching Werkt

React bereikt automatische batching door de uitvoering van state updates uit te stellen tot het einde van de huidige execution context. Hierdoor kan React alle state updates verzamelen die tijdens die context hebben plaatsgevonden en deze samenvoegen in een enkele update.

Beschouw dit vereenvoudigde voorbeeld:

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

Vóór React 18 zou het klikken op de knop twee re-renders activeren: een voor setCount1 en een andere voor setCount2. Met automatische batching in React 18 worden beide state updates samengevoegd, wat resulteert in slechts één re-render.

Voorbeelden van Automatische Batching in Actie

1. Asynchrone Updates

Asynchrone bewerkingen, zoals het ophalen van gegevens van een API, omvatten vaak het updaten van de state nadat de bewerking is voltooid. Automatische batching zorgt ervoor dat deze state updates worden samengevoegd, zelfs als ze plaatsvinden binnen de asynchrone callback.

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 dit voorbeeld worden setData en setLoading beide aangeroepen binnen de asynchrone fetchData-functie. React zal deze updates samenvoegen, wat resulteert in een enkele re-render zodra de gegevens zijn opgehaald en de laadstatus is bijgewerkt.

2. Promises

Net als bij asynchrone updates, omvatten promises vaak het updaten van de state wanneer de promise wordt opgelost of afgewezen. Automatische batching zorgt ervoor dat deze state updates ook worden samengevoegd.

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 dit geval worden setResult en setError(null) aangeroepen bij succes, of setError en setResult(null) worden aangeroepen bij een mislukking. Ongeacht, automatische batching combineert deze in een enkele re-render.

3. Native Event Handlers

Soms moet u native event handlers (bijv. addEventListener) gebruiken in plaats van React's synthetische event handlers. Automatische batching werkt ook in deze gevallen.

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

Hoewel setScrollPosition wordt aangeroepen binnen een native event handler, zal React de updates nog steeds samenvoegen, waardoor overmatige re-renders worden voorkomen terwijl de gebruiker scrollt.

Afzien van Automatische Batching

In zeldzame gevallen wilt u mogelijk afzien van automatische batching. U wilt bijvoorbeeld een synchrone update forceren om ervoor te zorgen dat de UI onmiddellijk wordt bijgewerkt. React biedt de flushSync API voor dit doel.

Opmerking: Het gebruik van flushSync moet spaarzaam gebeuren, omdat dit de prestaties negatief kan beïnvloeden. Het is over het algemeen het beste om te vertrouwen op automatische batching waar mogelijk.

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 dit voorbeeld dwingt flushSync React om de state onmiddellijk bij te werken en de component opnieuw te renderen, waardoor automatische batching wordt omzeild.

Beste Praktijken voor het Optimaliseren van State Updates

Hoewel automatische batching aanzienlijke prestatieverbeteringen biedt, is het nog steeds belangrijk om de beste praktijken te volgen voor het optimaliseren van state updates:

Automatische Batching en Globale Overwegingen

Automatische batching, een kernprestatie-optimalisatie van React, komt applicaties wereldwijd ten goede, ongeacht de locatie van de gebruiker, de netwerksnelheid of het apparaat. De impact ervan kan echter merkbaarder zijn in scenario's met langzamere internetverbindingen of minder krachtige apparaten. Voor internationale doelgroepen, overweeg deze punten:

Conclusie

React automatische batching is een krachtige optimalisatietechniek die de prestaties van uw React-applicaties aanzienlijk kan verbeteren. Door automatisch meerdere state updates in een enkele re-render te groeperen, vermindert het rendering overhead, voorkomt het inconsistente states en leidt het tot een soepelere en responsievere gebruikerservaring. Door te begrijpen hoe automatische batching werkt en de beste praktijken voor het optimaliseren van state updates te volgen, kunt u hoogwaardige React-applicaties bouwen die een geweldige gebruikerservaring leveren aan gebruikers over de hele wereld. Het benutten van tools zoals React DevTools helpt bij het verder verfijnen en optimaliseren van de prestatieprofielen van uw applicatie in diverse wereldwijde omgevingen.