Magyar

Ismerje meg, hogyan optimalizálja a React automatikus kötegelése a többszörös állapotfrissítéseket, javítva az alkalmazás teljesítményét és megakadályozva a szükségtelen újrarajzolásokat. Fedezzen fel példákat és bevált gyakorlatokat.

React automatikus kötegelés: Állapotfrissítések optimalizálása a teljesítmény érdekében

A React teljesítménye elengedhetetlen a zökkenőmentes és reszponzív felhasználói felületek létrehozásához. A teljesítmény javítására bevezetett kulcsfontosságú funkciók egyike az automatikus kötegelés. Ez az optimalizálási technika automatikusan csoportosítja a többszörös állapotfrissítéseket egyetlen újrarajzolásba, ami jelentős teljesítménynövekedést eredményez. Ez különösen releváns az összetett alkalmazásokban, ahol gyakori az állapotváltozás.

Mi az a React automatikus kötegelés?

A kötegelés a React esetében a többszörös állapotfrissítések egyetlen frissítésbe való csoportosításának a folyamata. A React 18 előtt a kötegelést csak a React eseménykezelőin belül bekövetkező frissítésekre alkalmazták. Az eseménykezelőkön kívüli frissítések, például a setTimeout, a promise-ok vagy a natív eseménykezelőkön belüliek, nem voltak kötegelve. Ez szükségtelen újrarajzolásokhoz és teljesítménybeli szűk keresztmetszetekhez vezethetett.

A React 18 bevezette az automatikus kötegelést, amely ezt az optimalizálást kiterjeszti minden állapotfrissítésre, függetlenül attól, hogy hol történnek. Ez azt jelenti, hogy függetlenül attól, hogy az állapotfrissítések egy React eseménykezelőben, egy setTimeout visszahívásban vagy egy promise feloldásban történnek, a React automatikusan kötegeli őket egyetlen újrarajzolásba.

Miért fontos az automatikus kötegelés?

Az automatikus kötegelés számos kulcsfontosságú előnnyel jár:

Hogyan működik az automatikus kötegelés

A React az automatikus kötegelést úgy éri el, hogy az állapotfrissítések végrehajtását a jelenlegi végrehajtási kontextus végéig késlelteti. Ez lehetővé teszi a React számára, hogy összegyűjtse az adott kontextus során bekövetkezett összes állapotfrissítést, és egyetlen frissítésbe kötegelje azokat.

Tekintsük ezt az egyszerűsített példát:

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

A React 18 előtt a gombra kattintás két újrarajzolást indított: egyet a setCount1-ért, egyet pedig a setCount2-ért. A React 18 automatikus kötegelésével mindkét állapotfrissítés kötegelve van, ami csak egy újrarajzolást eredményez.

Példák az automatikus kötegelésre a gyakorlatban

1. Aszinkron frissítések

Az aszinkron műveletek, például az API-ból történő adatlekérés gyakran az állapot frissítését foglalja magában a művelet befejezése után. Az automatikus kötegelés biztosítja, hogy ezeket az állapotfrissítéseket kötegbe rendezzük, még akkor is, ha azok az aszinkron visszahívásban történnek.

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

Ebben a példában a setData és a setLoading is az aszinkron fetchData függvényen belül van meghívva. A React kötegelni fogja ezeket a frissítéseket, ami egyetlen újrarajzolást eredményez, miután az adatok beolvasásra kerültek, és a betöltési állapot frissült.

2. Promise-ok

Az aszinkron frissítésekhez hasonlóan a promise-ok gyakran magukban foglalják az állapot frissítését, amikor a promise feloldódik vagy elutasításra kerül. Az automatikus kötegelés biztosítja, hogy ezeket az állapotfrissítéseket is kötegbe rendezzük.

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

Ebben az esetben a setResult és az setError(null) hívása történik a siker esetén, vagy az setError és a setResult(null) hívása a hiba esetén. Függetlenül attól, az automatikus kötegelés ezeket egyetlen újrarajzolásba kombinálja.

3. Natív eseménykezelők

Néha a natív eseménykezelőket (pl. addEventListener) kell használnia a React szintetikus eseménykezelői helyett. Az automatikus kötegelés ezekben az esetekben is működik.

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

Annak ellenére, hogy a setScrollPosition egy natív eseménykezelőn belül van meghívva, a React mégis kötegelni fogja a frissítéseket, megakadályozva a túlzott újrarajzolást, miközben a felhasználó görget.

Az automatikus kötegelésből való kilépés

Ritka esetekben érdemes lehet kilépni az automatikus kötegelésből. Például előfordulhat, hogy kényszeríteni szeretné a szinkron frissítést, hogy a felhasználói felület azonnal frissüljön. A React ehhez a flushSync API-t biztosítja.

Megjegyzés: A flushSync használata takarékosnak kell lennie, mivel negatívan befolyásolhatja a teljesítményt. Általában a legjobb, ha a lehető legtöbbször az automatikus kötegelésre támaszkodik.

import { flushSync } from 'react-dom';

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

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

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

Ebben a példában a flushSync arra kényszeríti a React-et, hogy azonnal frissítse az állapotot, és újrarajzolja a komponenst, megkerülve az automatikus kötegelést.

A legjobb gyakorlatok az állapotfrissítések optimalizálásához

Bár az automatikus kötegelés jelentős teljesítményjavulást biztosít, továbbra is fontos betartani a legjobb gyakorlatokat az állapotfrissítések optimalizálásához:

Automatikus kötegelés és globális szempontok

Az automatikus kötegelés, mint egy alapvető React teljesítményoptimalizálás, globálisan előnyös az alkalmazások számára, függetlenül a felhasználó tartózkodási helyétől, a hálózati sebességtől vagy az eszköztől. Hatása azonban feltűnőbb lehet lassabb internetkapcsolattal vagy kevésbé hatékony eszközökkel rendelkező forgatókönyvekben. A nemzetközi közönség számára vegye figyelembe a következő pontokat:

Következtetés

A React automatikus kötegelés egy hatékony optimalizálási technika, amely jelentősen javíthatja a React alkalmazásainak a teljesítményét. Azáltal, hogy automatikusan csoportosítja a többszörös állapotfrissítéseket egyetlen újrarajzolásba, csökkenti a renderelési terhelést, megakadályozza a következetlen állapotokat, és zökkenőmentesebb és reszponzívabb felhasználói élményt eredményez. Az automatikus kötegelés működésének megértésével, valamint az állapotfrissítések optimalizálására vonatkozó bevált gyakorlatok követésével nagy teljesítményű React alkalmazásokat építhet, amelyek nagyszerű felhasználói élményt nyújtanak a felhasználóknak világszerte. Az olyan eszközök kihasználása, mint a React DevTools, segít tovább finomítani és optimalizálni az alkalmazás teljesítményprofiljait a különböző globális beállításokban.

React automatikus kötegelés: Állapotfrissítések optimalizálása a teljesítmény érdekében | MLOG