⊗jsrtPmHkUTr 17 of 47 menu

Hook optymalizacji wydajności useTransition w React

Hook optymalizacji wydajności useTransition pozwala nam aktualizować stany bez blokowania interfejsu użytkownika.

Za pomocą tego hooka możemy ustawić aktualizacji jakiegoś stanu niski priorytet, co pozwoli aktualizacji innych stanów mieć wysoki priorytet i wykonywać się bez opóźnień.

Jako przykład można przytoczyć filtrowanie rozwijanej listy produktów podczas wprowadzania przez użytkownika znaków w polu wyszukiwania. Oczywiście, sama lista może wyświetlać się z pewnym opóźnieniem, ale nie chcielibyśmy, żeby znaki były wprowadzane w pole wyszukiwania z opóźnieniem.

Spójrzmy, jak w takich przypadkach może nam pomóc hook useTransition. Załóżmy, że mamy fragment kodu głównego komponentu. Przeanalizujmy go:

import { useTransition } from 'react'; import { useState } from 'react'; function App() { const [isPending, startTransition] = useTransition(); const [filterTerm, setFilterTerm] = useState(''); const filteredProducts = filterProducts(filterTerm); function updateFilterHandler(event) { startTransition(() => { setFilterTerm(event.target.value); }); } return ( <div> <input type="text" onChange={updateFilterHandler} /> <ProductList products={filteredProducts} /> </div> ); }

Tutaj widzimy dwie zmienne dla useTransition. Zmienna isPending zawiera wartość logiczną i pokazuje czy proces aktualizacji jest zakończony, a startTransition to funkcja, która pozwala obniżyć priorytet aktualizacji:

const [isPending, startTransition] = useTransition();

Mamy także stan filterTerm, w którym przechowywane jest wprowadzane w pole wprowadzania wyrażenie i funkcja setFilterTerm do jego ustawienia:

const [filterTerm, setFilterTerm] = useState('');

Podczas wprowadzania znaków w input za każdym razem wywoływana jest funkcja updateFilterHandler, w której następuje aktualizacja filterTerm. Właśnie tutaj stosujemy nasz hook useTransition, owijając funkcję ustawiającą setFilterTerm w startTransition w następujący sposób:

function updateFilterHandler(event) { startTransition(() => { setFilterTerm(event.target.value); }); }

W ten sposób ustawiliśmy dla aktualizacji stanu filterTerm niski priorytet i nasze pole wprowadzania pozostanie reagujące.

Za pomocą zmiennej isPending możemy pokazać użytkownikowi, że aktualizacja listy jest jeszcze w trakcie. Wyświetlmy tę informację pod polem wprowadzania, dopóki lista jest aktualizowana:

return ( <div> <input type="text" onChange={updateFilterHandler} /> {isPending && <p>aktualizowanie ...</p>} <ProductList products={filteredProducts} /> </div> );
Polski
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Wykorzystujemy pliki cookie do działania strony, analizy i personalizacji. Przetwarzanie danych odbywa się zgodnie z Polityką prywatności.
zaakceptuj wszystkie dostosuj odrzuć