Čeština

Zjistěte, jak automatické dávkování v Reactu optimalizuje aktualizace stavu, zlepšuje výkon a brání zbytečným překreslením. Prozkoumejte příklady a postupy.

Automatické dávkování v Reactu: Optimalizace aktualizací stavu pro vyšší výkon

Výkon aplikací v Reactu je klíčový pro vytváření plynulých a responzivních uživatelských rozhraní. Jednou z klíčových funkcí zavedených pro zlepšení výkonu je automatické dávkování (automatic batching). Tato optimalizační technika automaticky seskupuje více aktualizací stavu do jednoho překreslení, což vede k výraznému zvýšení výkonu. To je zvláště důležité v komplexních aplikacích s častými změnami stavu.

Co je automatické dávkování v Reactu?

Dávkování (batching) v kontextu Reactu je proces seskupování více aktualizací stavu do jedné jediné aktualizace. Před verzí React 18 se dávkování aplikovalo pouze na aktualizace, které probíhaly uvnitř obsluhy událostí (event handlers) Reactu. Aktualizace mimo obsluhy událostí, jako jsou ty v rámci setTimeout, promises nebo nativních obsluh událostí, nebyly dávkovány. To mohlo vést k zbytečným překreslením a výkonnostním problémům.

React 18 zavedl automatické dávkování, které tuto optimalizaci rozšiřuje na všechny aktualizace stavu bez ohledu na to, kde k nim dochází. To znamená, že ať už se vaše aktualizace stavu odehrávají uvnitř obsluhy událostí Reactu, v callbacku setTimeout nebo při vyřešení promise, React je automaticky seskupí do jednoho jediného překreslení.

Proč je automatické dávkování důležité?

Automatické dávkování přináší několik klíčových výhod:

Jak automatické dávkování funguje

React dosahuje automatického dávkování tím, že odkládá spuštění aktualizací stavu až na konec aktuálního kontextu provádění. To umožňuje Reactu shromáždit všechny aktualizace stavu, které se v daném kontextu vyskytly, a seskupit je do jedné jediné aktualizace.

Zvažte tento zjednodušený pří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>Count 1: {count1}</p>
      <p>Count 2: {count2}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

Před verzí React 18 by kliknutí na tlačítko spustilo dvě překreslení: jedno pro setCount1 a druhé pro setCount2. S automatickým dávkováním v Reactu 18 jsou obě aktualizace stavu seskupeny dohromady, což vede pouze k jednomu překreslení.

Příklady automatického dávkování v praxi

1. Asynchronní aktualizace

Asynchronní operace, jako je načítání dat z API, často zahrnují aktualizaci stavu po dokončení operace. Automatické dávkování zajišťuje, že tyto aktualizace stavu jsou seskupeny dohromady, i když k nim dochází v rámci asynchronního 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('Error fetching data:', error);
        setLoading(false);
      }
    }

    fetchData();
  }, []);

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

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

V tomto příkladu jsou setData a setLoading volány v asynchronní funkci fetchData. React tyto aktualizace seskupí, což povede k jedinému překreslení, jakmile jsou data načtena a stav načítání je aktualizován.

2. Promises

Podobně jako u asynchronních aktualizací, promises často zahrnují aktualizaci stavu, když se promise vyřeší (resolve) nebo zamítne (reject). Automatické dávkování zajišťuje, že i tyto aktualizace stavu jsou dávkovány dohromady.

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

V tomto případě jsou při úspěchu volány funkce setResult a setError(null), nebo při neúspěchu setError a setResult(null). Bez ohledu na výsledek je automatické dávkování zkombinuje do jednoho překreslení.

3. Nativní obsluha událostí

Někdy můžete potřebovat použít nativní obsluhu událostí (např. addEventListener) namísto syntetických obsluh událostí Reactu. Automatické dávkování funguje i v těchto případech.

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

I když je setScrollPosition voláno v rámci nativní obsluhy událostí, React bude stále seskupovat aktualizace, čímž zabrání nadměrnému překreslování při posouvání stránky uživatelem.

Jak se vyhnout automatickému dávkování

Ve vzácných případech se můžete chtít automatickému dávkování vyhnout. Například, pokud chcete vynutit synchronní aktualizaci, aby se uživatelské rozhraní okamžitě aktualizovalo. Pro tento účel poskytuje React API flushSync.

Poznámka: Používání flushSync by mělo být omezené, protože může negativně ovlivnit výkon. Obecně je nejlepší spoléhat se na automatické dávkování, kdykoli 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}>Increment</button>);
}

V tomto příkladu flushSync nutí React okamžitě aktualizovat stav a překreslit komponentu, čímž obchází automatické dávkování.

Osvědčené postupy pro optimalizaci aktualizací stavu

Ačkoli automatické dávkování přináší výrazné zlepšení výkonu, je stále důležité dodržovat osvědčené postupy pro optimalizaci aktualizací stavu:

Automatické dávkování a globální souvislosti

Automatické dávkování, jakožto klíčová optimalizace výkonu v Reactu, přináší výhody aplikacím globálně bez ohledu na polohu uživatele, rychlost sítě nebo zařízení. Jeho dopad však může být znatelnější v situacích s pomalejším internetovým připojením nebo méně výkonnými zařízeními. Pro mezinárodní publikum zvažte tyto body:

Závěr

Automatické dávkování v Reactu je výkonná optimalizační technika, která může výrazně zlepšit výkon vašich aplikací. Automatickým seskupováním více aktualizací stavu do jednoho překreslení snižuje režii při vykreslování, zabraňuje nekonzistentním stavům a vede k plynulejšímu a responzivnějšímu uživatelskému zážitku. Porozuměním tomu, jak automatické dávkování funguje, a dodržováním osvědčených postupů pro optimalizaci aktualizací stavu můžete vytvářet vysoce výkonné aplikace v Reactu, které poskytují skvělý uživatelský zážitek uživatelům po celém světě. Využití nástrojů jako React DevTools pomáhá dále ladit a optimalizovat výkonnostní profily vaší aplikace v různých globálních prostředích.

Automatické dávkování v Reactu: Optimalizace aktualizací stavu pro vyšší výkon | MLOG