Slovenčina

Zistite, ako automatické dávkovanie v Reacte optimalizuje viacnásobné aktualizácie stavu, zlepšuje výkon aplikácie a zabraňuje zbytočným prekresleniam. Preskúmajte príklady a osvedčené postupy.

Automatické dávkovanie v Reacte: Optimalizácia aktualizácií stavu pre lepší výkon

Výkon Reactu je kľúčový pre vytváranie plynulých a responzívnych používateľských rozhraní. Jednou z kľúčových funkcií zavedených na zlepšenie výkonu je automatické dávkovanie (automatic batching). Táto optimalizačná technika automaticky zoskupuje viacero aktualizácií stavu do jedného prekreslenia, čo vedie k výraznému nárastu výkonu. To je obzvlášť dôležité v komplexných aplikáciách s častými zmenami stavu.

Čo je automatické dávkovanie v Reacte?

Dávkovanie v kontexte Reactu je proces zoskupovania viacerých aktualizácií stavu do jednej jedinej aktualizácie. Pred verziou React 18 sa dávkovanie uplatňovalo iba na aktualizácie, ktoré sa vyskytli v rámci obsluhy udalostí (event handlers) Reactu. Aktualizácie mimo obsluhy udalostí, ako napríklad tie v rámci setTimeout, promises (sľubov) alebo natívnych obslúh udalostí, neboli dávkované. To mohlo viesť k zbytočným prekresleniam a výkonnostným problémom.

React 18 priniesol automatické dávkovanie, ktoré rozširuje túto optimalizáciu na všetky aktualizácie stavu, bez ohľadu na to, kde k nim dochádza. To znamená, že či už sa vaše aktualizácie stavu dejú v rámci obsluhy udalostí Reactu, v spätnom volaní (callback) setTimeout alebo pri vyriešení sľubu (promise), React ich automaticky zoskupí do jedného prekreslenia.

Prečo je automatické dávkovanie dôležité?

Automatické dávkovanie poskytuje niekoľko kľúčových výhod:

Ako funguje automatické dávkovanie

React dosahuje automatické dávkovanie odložením vykonania aktualizácií stavu až na koniec aktuálneho kontextu vykonávania. To umožňuje Reactu zhromaždiť všetky aktualizácie stavu, ktoré sa vyskytli počas tohto kontextu, a zoskupiť ich do jednej aktualizácie.

Zvážte tento zjednodušený príklad:

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>Počet 1: {count1}</p>
      <p>Počet 2: {count2}</p>
      <button onClick={handleClick}>Zvýšiť</button>
    </div>
  );
}

Pred verziou React 18 by kliknutie na tlačidlo spustilo dve prekreslenia: jedno pre setCount1 a druhé pre setCount2. S automatickým dávkovaním v React 18 sú obe aktualizácie stavu zoskupené, čo vedie iba k jednému prekresleniu.

Príklady automatického dávkovania v praxi

1. Asynchrónne aktualizácie

Asynchrónne operácie, ako je načítavanie dát z API, často zahŕňajú aktualizáciu stavu po dokončení operácie. Automatické dávkovanie zaisťuje, že tieto aktualizácie stavu sú zoskupené, aj keď k nim dochádza v rámci asynchrónneho spätného volania (callbacku).

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('Chyba pri načítavaní dát:', error);
        setLoading(false);
      }
    }

    fetchData();
  }, []);

  if (loading) {
    return <p>Načítava sa...</p>;
  }

  return <div>Dáta: {JSON.stringify(data)}</div>;
}

V tomto príklade sú setData a setLoading volané v rámci asynchrónnej funkcie fetchData. React tieto aktualizácie zoskupí, čo vedie k jedinému prekresleniu po načítaní dát a aktualizácii stavu načítavania.

2. Promises (sľuby)

Podobne ako pri asynchrónnych aktualizáciách, aj promises (sľuby) často zahŕňajú aktualizáciu stavu, keď sa sľub vyrieši alebo zamietne. Automatické dávkovanie zaisťuje, že aj tieto aktualizácie stavu sú zoskupené.

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('Sľub bol vyriešený!');
        } else {
          reject('Sľub bol zamietnutý!');
        }
      }, 1000);
    });

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

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

  if (result) {
    return <p>Výsledok: {result}</p>;
  }

  return <p>Načítava sa...</p>;
}

V tomto prípade sú pri úspechu volané setResult a setError(null), alebo pri neúspechu setError a setResult(null). Bez ohľadu na výsledok, automatické dávkovanie ich skombinuje do jedného prekreslenia.

3. Natívne obsluhy udalostí

Niekedy môžete potrebovať použiť natívne obsluhy udalostí (napr. addEventListener) namiesto syntetických obslúh udalostí v Reacte. Automatické dávkovanie funguje aj v týchto prípadoch.

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

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

    window.addEventListener('scroll', handleScroll);

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

  return <p>Pozícia posúvania: {scrollPosition}</p>;
}

Aj keď je setScrollPosition volané v rámci natívnej obsluhy udalosti, React bude stále zoskupovať aktualizácie, čím zabráni nadmerným prekresleniam pri posúvaní stránky používateľom.

Ako sa vyhnúť automatickému dávkovaniu

V zriedkavých prípadoch sa môžete chcieť vyhnúť automatickému dávkovaniu. Napríklad, ak chcete vynútiť synchrónnu aktualizáciu, aby sa používateľské rozhranie okamžite aktualizovalo. React na tento účel poskytuje API flushSync.

Poznámka: Používanie flushSync by malo byť zriedkavé, pretože môže negatívne ovplyvniť výkon. Vo všeobecnosti je najlepšie spoľahnúť sa na automatické dávkovanie, kedykoľvek je to možné.

import { flushSync } from 'react-dom';

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

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

  return (<button onClick={handleClick}>Zvýšiť</button>);
}

V tomto príklade flushSync núti React okamžite aktualizovať stav a prekresliť komponent, čím obchádza automatické dávkovanie.

Osvedčené postupy pre optimalizáciu aktualizácií stavu

Hoci automatické dávkovanie prináša významné zlepšenia výkonu, je stále dôležité dodržiavať osvedčené postupy pre optimalizáciu aktualizácií stavu:

Automatické dávkovanie a globálne aspekty

Automatické dávkovanie, ako základná optimalizácia výkonu v Reacte, prináša výhody aplikáciám globálne bez ohľadu na polohu používateľa, rýchlosť siete alebo zariadenie. Jeho vplyv však môže byť výraznejší v scenároch s pomalším internetovým pripojením alebo menej výkonnými zariadeniami. Pre medzinárodné publikum zvážte tieto body:

Záver

Automatické dávkovanie v Reacte je výkonná optimalizačná technika, ktorá môže výrazne zlepšiť výkon vašich React aplikácií. Automatickým zoskupovaním viacerých aktualizácií stavu do jedného prekreslenia znižuje réžiu pri vykresľovaní, zabraňuje nekonzistentným stavom a vedie k plynulejšiemu a responzívnejšiemu používateľskému zážitku. Porozumením tomu, ako automatické dávkovanie funguje, a dodržiavaním osvedčených postupov pre optimalizáciu aktualizácií stavu môžete vytvárať vysokovýkonné React aplikácie, ktoré poskytujú skvelý používateľský zážitok používateľom po celom svete. Využívanie nástrojov ako React DevTools pomáha ďalej zdokonaľovať a optimalizovať výkonnostné profily vašej aplikácie v rôznych globálnych prostrediach.

Automatické dávkovanie v Reacte: Optimalizácia aktualizácií stavu pre lepší výkon | MLOG