Latviešu

Uzziniet, kā React automātiskā pakešapstrāde optimizē vairākus stāvokļa atjauninājumus, uzlabojot lietotnes veiktspēju un novēršot liekas renderēšanas reizes. Izpētiet piemērus un praksi.

React automātiskā pakešapstrāde: stāvokļa atjauninājumu optimizēšana veiktspējai

React veiktspēja ir izšķiroša, lai radītu plūstošas un atsaucīgas lietotāja saskarnes. Viena no galvenajām funkcijām, kas ieviesta veiktspējas uzlabošanai, ir automātiskā pakešapstrāde. Šī optimizācijas tehnika automātiski grupē vairākus stāvokļa atjauninājumus vienā atkārtotā renderēšanas reizē, nodrošinot ievērojamus veiktspējas ieguvumus. Tas ir īpaši svarīgi sarežģītās lietojumprogrammās ar biežām stāvokļa izmaiņām.

Kas ir React automātiskā pakešapstrāde?

Pakešapstrāde, React kontekstā, ir vairāku stāvokļa atjauninājumu grupēšanas process vienā atjauninājumā. Pirms React 18 pakešapstrāde tika piemērota tikai tiem atjauninājumiem, kas notika React notikumu apstrādātāju iekšienē. Atjauninājumi ārpus notikumu apstrādātājiem, piemēram, tie, kas atradās setTimeout, solījumos vai dabīgajos notikumu apstrādātājos, netika pakešapstrādāti. Tas varēja izraisīt nevajadzīgus atkārtotus renderēšanas procesus un veiktspējas vājos punktus.

React 18 ieviesa automātisko pakešapstrādi, kas paplašina šo optimizāciju uz visiem stāvokļa atjauninājumiem neatkarīgi no to rašanās vietas. Tas nozīmē, ka neatkarīgi no tā, vai jūsu stāvokļa atjauninājumi notiek React notikumu apstrādātāja iekšienē, a setTimeout atsauces funkcijā vai solījuma izpildē, React tos automātiski grupēs kopā vienā atkārtotā renderēšanas reizē.

Kāpēc automātiskā pakešapstrāde ir svarīga?

Automātiskā pakešapstrāde nodrošina vairākas galvenās priekšrocības:

Kā darbojas automātiskā pakešapstrāde

React panāk automātisko pakešapstrādi, aizkavējot stāvokļa atjauninājumu izpildi līdz pašreizējā izpildes konteksta beigām. Tas ļauj React savākt visus stāvokļa atjauninājumus, kas notika šajā kontekstā, un apstrādāt tos kopā vienā atjauninājumā.

Apskatīsim šo vienkāršoto piemēru:

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

Pirms React 18, noklikšķinot uz pogas, tiktu aktivizēti divi atkārtoti renderēšanas procesi: viens priekš setCount1 un otrs priekš setCount2. Ar automātisko pakešapstrādi React 18 abas stāvokļa atjaunināšanas tiek pakešapstrādātas kopā, kā rezultātā notiek tikai viena atkārtota renderēšana.

Automātiskās pakešapstrādes piemēri darbībā

1. Asinhronie atjauninājumi

Asinhronās darbības, piemēram, datu ielāde no API, bieži ietver stāvokļa atjaunināšanu pēc darbības pabeigšanas. Automātiskā pakešapstrāde nodrošina, ka šie stāvokļa atjauninājumi tiek apstrādāti kopā, pat ja tie notiek asinhronās atsauces funkcijā.

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

Šajā piemērā gan setData, gan setLoading tiek izsaukti asinhronās funkcijas fetchData iekšienē. React apstrādās šos atjauninājumus kopā, kā rezultātā notiks viena atkārtota renderēšana, tiklīdz dati būs iegūti un ielādes stāvoklis būs atjaunināts.

2. Solījumi

Līdzīgi asinhronajiem atjauninājumiem, solījumi bieži ietver stāvokļa atjaunināšanu, kad solījums tiek izpildīts vai noraidīts. Automātiskā pakešapstrāde nodrošina, ka šie stāvokļa atjauninājumi tiek apstrādāti kopā.

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

Šajā gadījumā, ja tas ir veiksmīgi, tiek izsaukti setResult un setError(null), vai neveiksmes gadījumā tiek izsaukti setError un setResult(null). Neatkarīgi no tā, automātiskā pakešapstrāde tos apvienos vienā atkārtotā renderēšanas reizē.

3. Dabīgie notikumu apstrādātāji

Dažreiz jums var būt nepieciešams izmantot dabīgos notikumu apstrādātājus (piemēram, addEventListener) React sintētisko notikumu apstrādātāju vietā. Automātiskā pakešapstrāde darbojas arī šajos gadījumos.

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

Pat ja setScrollPosition tiek izsaukts dabīgā notikumu apstrādātāja iekšienē, React joprojām apstrādās atjauninājumus kopā, novēršot pārmērīgas atkārtotas renderēšanas, kamēr lietotājs ritina lapu.

Atteikšanās no automātiskās pakešapstrādes

Retos gadījumos jūs varat vēlēties atteikties no automātiskās pakešapstrādes. Piemēram, jūs varat vēlēties piespiest sinhronu atjaunināšanu, lai nodrošinātu, ka lietotāja saskarne tiek atjaunināta nekavējoties. React nodrošina flushSync API šim nolūkam.

Piezīme: flushSync jāizmanto reti, jo tas var negatīvi ietekmēt veiktspēju. Parasti vislabāk ir paļauties uz automātisko pakešapstrādi, kad vien tas ir iespējams.

import { flushSync } from 'react-dom';

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

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

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

Šajā piemērā flushSync piespiež React nekavējoties atjaunināt stāvokli un atkārtoti renderēt komponentu, apejot automātisko pakešapstrādi.

Labākā prakse stāvokļa atjauninājumu optimizēšanai

Lai gan automātiskā pakešapstrāde nodrošina ievērojamus veiktspējas uzlabojumus, joprojām ir svarīgi ievērot labāko praksi stāvokļa atjauninājumu optimizēšanai:

Automātiskā pakešapstrāde un globālie apsvērumi

Automātiskā pakešapstrāde, būdama galvenā React veiktspējas optimizācija, sniedz ieguvumus lietojumprogrammām globālā mērogā neatkarīgi no lietotāja atrašanās vietas, tīkla ātruma vai ierīces. Tomēr tās ietekme var būt pamanāmāka scenārijos ar lēnākiem interneta savienojumiem vai mazāk jaudīgām ierīcēm. Starptautiskai auditorijai jāņem vērā šādi punkti:

Secinājums

React automātiskā pakešapstrāde ir jaudīga optimizācijas tehnika, kas var ievērojami uzlabot jūsu React lietojumprogrammu veiktspēju. Automātiski grupējot vairākus stāvokļa atjauninājumus vienā atkārtotā renderēšanas reizē, tā samazina renderēšanas pieskaitāmo darbu, novērš nesakritīgus stāvokļus un nodrošina plūstošāku un atsaucīgāku lietotāja pieredzi. Izprotot, kā darbojas automātiskā pakešapstrāde, un ievērojot labāko praksi stāvokļa atjauninājumu optimizēšanai, varat veidot augstas veiktspējas React lietojumprogrammas, kas nodrošina lielisku lietotāja pieredzi lietotājiem visā pasaulē. Tādu rīku kā React DevTools izmantošana palīdz tālāk precizēt un optimizēt jūsu lietojumprogrammas veiktspējas profilus dažādos globālajos apstākļos.