Norsk

Lær hvordan Reacts automatiske batching optimaliserer flere tilstandsoppdateringer, forbedrer ytelsen og forhindrer unødvendige gjengivelser.

Reacts Automatiske Batching: Optimalisering av tilstandsoppdateringer for ytelse

Reacts ytelse er avgjørende for å skape jevne og responsive brukergrensesnitt. En av nøkkelfunksjonene som er introdusert for å forbedre ytelsen er automatisk batching. Denne optimaliseringsteknikken grupperer automatisk flere tilstandsoppdateringer i én enkelt gjengivelse, noe som gir betydelige ytelsesforbedringer. Dette er spesielt relevant i komplekse applikasjoner med hyppige tilstandsendringer.

Hva er Reacts Automatiske Batching?

Batching, i Reacts kontekst, er prosessen med å gruppere flere tilstandsoppdateringer til én enkelt oppdatering. Før React 18 ble batching kun brukt på oppdateringer som skjedde inne i React-hendelseshåndterere. Oppdateringer utenfor hendelseshåndterere, som de innen setTimeout, løfter eller native hendelseshåndterere, ble ikke batchet. Dette kunne føre til unødvendige gjengivelser og ytelsesflaskehalser.

React 18 introduserte automatisk batching, som utvider denne optimaliseringen til alle tilstandsoppdateringer, uavhengig av hvor de forekommer. Dette betyr at enten dine tilstandsoppdateringer skjer inne i en React-hendelseshåndterer, en setTimeout-callback eller en løfteoppløsning, vil React automatisk batche dem sammen til én enkelt gjengivelse.

Hvorfor er Automatisk Batching Viktig?

Automatisk batching gir flere sentrale fordeler:

Hvordan Automatisk Batching Fungerer

React oppnår automatisk batching ved å utsette utførelsen av tilstandsoppdateringer til slutten av den gjeldende utførelseskonteksten. Dette lar React samle alle tilstandsoppdateringer som skjedde under den konteksten og batche dem sammen til én enkelt oppdatering.

Vurder dette forenklede eksemplet:

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

Før React 18 ville klikk på knappen utløse to gjengivelser: én for setCount1 og én for setCount2. Med automatisk batching i React 18 blir begge tilstandsoppdateringene batchet sammen, noe som resulterer i kun én gjengivelse.

Eksempler på Automatisk Batching i Aksjon

1. Asynkrone Oppdateringer

Asynkrone operasjoner, som å hente data fra en API, innebærer ofte oppdatering av tilstanden etter at operasjonen er fullført. Automatisk batching sikrer at disse tilstandsoppdateringene blir batchet sammen, selv om de skjer innenfor den asynkrone callbacken.

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

I dette eksemplet blir både setData og setLoading kalt innenfor den asynkrone fetchData-funksjonen. React vil batche disse oppdateringene sammen, noe som resulterer i én enkelt gjengivelse når dataene er hentet og loading-tilstanden er oppdatert.

2. Løfter (Promises)

Tilsvarende asynkrone oppdateringer, innebærer løfter ofte oppdatering av tilstanden når løftet løses eller forkastes. Automatisk batching sikrer at disse tilstandsoppdateringene også blir batchet sammen.

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

I dette tilfellet kalles enten setResult og setError(null) ved suksess, eller setError og setResult(null) ved feil. Uansett vil automatisk batching kombinere disse til én enkelt gjengivelse.

3. Native Hendelseshåndterere

Noen ganger kan det være nødvendig å bruke native hendelseshåndterere (f.eks. addEventListener) i stedet for Reacts syntetiske hendelseshåndterere. Automatisk batching fungerer også i disse tilfellene.

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

Selv om setScrollPosition kalles innenfor en native hendelseshåndterer, vil React fortsatt batche oppdateringene sammen, og forhindre overdreven gjengivelse mens brukeren scroller.

Å Velge Bort Automatisk Batching

I sjeldne tilfeller kan du ønske å velge bort automatisk batching. For eksempel kan du ønske å tvinge en synkron oppdatering for å sikre at grensesnittet oppdateres umiddelbart. React tilbyr flushSync API-et for dette formålet.

Merk: Bruk av flushSync bør gjøres sparsomt, da det kan påvirke ytelsen negativt. Det er generelt best å stole på automatisk batching når det er mulig.

import { flushSync } from 'react-dom';

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

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

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

I dette eksemplet tvinger flushSync React til å umiddelbart oppdatere tilstanden og gjengi komponenten på nytt, og omgår automatisk batching.

Beste Praksis for Optimalisering av Tilstandsoppdateringer

Selv om automatisk batching gir betydelige ytelsesforbedringer, er det fortsatt viktig å følge beste praksis for optimalisering av tilstandsoppdateringer:

Automatisk Batching og Globale Hensyn

Automatisk batching, som en sentral React-ytelsesoptimalisering, gagner applikasjoner globalt uavhengig av brukerens sted, nettverkshastighet eller enhet. Dens innvirkning kan imidlertid være mer merkbar i scenarier med tregere internettforbindelser eller mindre kraftige enheter. For internasjonale målgrupper, vurder disse punktene:

Konklusjon

Reacts automatiske batching er en kraftig optimaliseringsteknikk som kan forbedre ytelsen til dine React-applikasjoner betydelig. Ved å automatisk gruppere flere tilstandsoppdateringer i én enkelt gjengivelse, reduserer den gjengivelsesoverhead, forhindrer inkonsekvente tilstander og fører til en jevnere og mer responsiv brukeropplevelse. Ved å forstå hvordan automatisk batching fungerer og følge beste praksis for optimalisering av tilstandsoppdateringer, kan du bygge høyytelses React-applikasjoner som leverer en flott brukeropplevelse til brukere over hele verden. Bruk av verktøy som React DevTools hjelper til med å videreutvikle og optimalisere applikasjonens ytelsesprofiler i ulike globale omgivelser.

Reacts Automatiske Batching: Optimalisering av tilstandsoppdateringer for ytelse | MLOG