Hrvatski

Saznajte kako automatsko grupiranje Reacta optimizira višestruka ažuriranja stanja, poboljšavajući performanse aplikacije i sprječavajući nepotrebna ponovna renderiranja. Istražite primjere i najbolje prakse.

React automatsko grupiranje: Optimizacija ažuriranja stanja za performanse

Performanse Reacta ključne su za stvaranje glatkih i responzivnih korisničkih sučelja. Jedna od ključnih značajki uvedenih za poboljšanje performansi je automatsko grupiranje. Ova tehnika optimizacije automatski grupira višestruka ažuriranja stanja u jedno ponovno renderiranje, što dovodi do značajnog poboljšanja performansi. To je posebno relevantno u složenim aplikacijama s čestim promjenama stanja.

Što je React automatsko grupiranje?

Grupiranje, u kontekstu Reacta, proces je grupacije višestrukih ažuriranja stanja u jedno ažuriranje. Prije Reacta 18, grupiranje se primjenjivalo samo na ažuriranja koja su se događala unutar React rukovatelja događaja. Ažuriranja izvan rukovatelja događaja, poput onih unutar setTimeout, obećanja ili izvornih rukovatelja događaja, nisu bila grupirana. To je moglo dovesti do nepotrebnih ponovnih renderiranja i uskih grla u performansama.

React 18 uveo je automatsko grupiranje, koje proširuje ovu optimizaciju na sva ažuriranja stanja, bez obzira na to gdje se ona događaju. To znači da bez obzira na to jesu li vaša ažuriranja stanja unutar React rukovatelja događaja, setTimeout poziva ili rezolucije obećanja, React će ih automatski grupirati zajedno u jedno ponovno renderiranje.

Zašto je automatsko grupiranje važno?

Automatsko grupiranje pruža nekoliko ključnih prednosti:

Kako funkcionira automatsko grupiranje

React postiže automatsko grupiranje odgađanjem izvršavanja ažuriranja stanja do kraja trenutnog konteksta izvršavanja. To omogućuje Reactu da prikupi sva ažuriranja stanja koja su se dogodila tijekom tog konteksta i grupirati ih zajedno u jedno ažuriranje.

Razmotrite ovaj pojednostavljeni primjer:

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>Brojač 1: {count1}</p>
      <p>Brojač 2: {count2}</p>
      <button onClick={handleClick}>Povećaj</button>
    </div>
  );
}

Prije Reacta 18, klikom na gumb izazvala bi se dva ponovna renderiranja: jedno za setCount1 i drugo za setCount2. S automatskim grupiranjem u Reactu 18, oba ažuriranja stanja grupiraju se zajedno, što rezultira samo jednim ponovnim renderiranjem.

Primjeri automatskog grupiranja na djelu

1. Asinkrona ažuriranja

Asinkrone operacije, poput dohvaćanja podataka s API-ja, često uključuju ažuriranje stanja nakon završetka operacije. Automatsko grupiranje osigurava da se ta ažuriranja stanja grupiraju zajedno, čak i ako se događaju unutar asinkronog poziva.

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('Greška pri dohvaćanju podataka:', error);
        setLoading(false);
      }
    }

    fetchData();
  }, []);

  if (loading) {
    return <p>Učitavanje...</p>;
  }

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

U ovom primjeru, setData i setLoading pozivaju se unutar asinkrone funkcije fetchData. React će grupirati ova ažuriranja zajedno, rezultirajući jednim ponovnim renderiranjem nakon što se podaci dohvate i ažurira se stanje učitavanja.

2. Obećanja (Promises)

Slično asinkronim ažuriranjima, obećanja često uključuju ažuriranje stanja kada se obećanje riješi ili odbije. Automatsko grupiranje osigurava da se i ta ažuriranja stanja grupiraju zajedno.

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('Obećanje riješeno!');
        } else {
          reject('Obećanje odbijeno!');
        }
      }, 1000);
    });

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

  if (error) {
    return <p>Greška: {error}</p>;
  }

  if (result) {
    return <p>Rezultat: {result}</p>;
  }

  return <p>Učitavanje...</p>;
}

U ovom slučaju, bilo setResult i setError(null) pozivaju se pri uspjehu ili setError i setResult(null) pozivaju se pri neuspjehu. Bez obzira na to, automatsko grupiranje će kombinirati ove u jedno ponovno renderiranje.

3. Izvorni rukovatelji događaja

Ponekad ćete možda trebati koristiti izvorne rukovatelje događaja (npr. addEventListener) umjesto Reactovih sintetičkih rukovatelja događaja. Automatsko grupiranje također radi u tim slučajevima.

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

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

    window.addEventListener('scroll', handleScroll);

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

  return <p>Pozicija pomicanja: {scrollPosition}</p>;
}

Čak i ako se setScrollPosition pozove unutar izvornog rukovatelja događaja, React će i dalje grupirati ažuriranja zajedno, sprječavajući pretjerana ponovna renderiranja dok se korisnik pomiče.

Isključivanje automatskog grupiranja

U rijetkim slučajevima, možda ćete se htjeti isključiti iz automatskog grupiranja. Na primjer, možda želite prisiliti sinkrono ažuriranje kako biste osigurali da se korisničko sučelje odmah ažurira. React za tu svrhu pruža API flushSync.

Napomena: Korištenje flushSync treba raditi štedljivo, jer može negativno utjecati na performanse. Općenito je najbolje osloniti se na automatsko grupiranje kad god je to moguće.

import { flushSync } from 'react-dom';

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

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

  return (<button onClick={handleClick}>Povećaj</button>);
}

U ovom primjeru, flushSync prisiljava React da odmah ažurira stanje i ponovno renderira komponentu, zaobilazeći automatsko grupiranje.

Najbolje prakse za optimizaciju ažuriranja stanja

Iako automatsko grupiranje pruža značajna poboljšanja performansi, još uvijek je važno slijediti najbolje prakse za optimizaciju ažuriranja stanja:

Automatsko grupiranje i globalne razmatranja

Automatsko grupiranje, kao temeljna optimizacija performansi Reacta, globalno koristi aplikacije bez obzira na korisnikovu lokaciju, brzinu mreže ili uređaj. Međutim, njegov utjecaj može biti primjetniji u scenarijima s sporijim internetskim vezama ili manje snažnim uređajima. Za međunarodnu publiku, razmotrite ove točke:

Zaključak

Automatsko grupiranje u Reactu moćna je tehnika optimizacije koja može značajno poboljšati performanse vaših React aplikacija. Automatskim grupiranjem višestrukih ažuriranja stanja u jedno ponovno renderiranje, smanjuje troškove renderiranja, sprječava nedosljedna stanja i dovodi do glađeg i responzivnijeg korisničkog iskustva. Razumijevanjem kako funkcionira automatsko grupiranje i slijedeći najbolje prakse za optimizaciju ažuriranja stanja, možete izgraditi visokoperformantne React aplikacije koje pružaju sjajno korisničko iskustvo korisnicima diljem svijeta. Korištenje alata poput React DevTools pomaže u daljnjem usavršavanju i optimizaciji profila performansi vaše aplikacije u raznolikim globalnim postavkama.