Wbudowane hooki reactowe

Hooki pozwalają na używanie różnych funkcjonalności reactowych wewnątrz komponentów. Możesz skorzystać z tych wbudowanych lub stworzyć własne poprzez ich połączenie. Poniżej znajdziesz listę wszystkich hooków dostępnych w Reakcie.


Hooki stanu

Stan pozwala komponentowi “pamiętać” informacje, np. dane wprowadzone przez użytkownika. Przykładowo, komponent formularza może przechowywać w stanie wartości pól formularza, a komponent galerii zdjęć może pamiętać pozycję aktualnie zaznaczonego elementu.

Aby dodać stan do komponentu, użyj jednego z tych hooków:

function ImageGallery() {
const [index, setIndex] = useState(0);
// ...

Hooki kontekstu

Kontekst pozwala komponentowi odbierać informacje od odległych rodziców bez przekazywania ich bezpośrednio za pomocą właściwości. Przykładowo, komponent główny aplikacji może przekazać aktualny motyw kolorystyczny wszystkim komponentom w drzewie poniżej, bez względu na to, jak głęboko są zagnieżdżone.

  • useContext odczytuje wartości z kontekstu i subskrybuje się na wszelkie ich zmiany.
function Button() {
const theme = useContext(ThemeContext);
// ...

Hooki referencji

Referencje pozwalają komponentowi trzymać informacje, które nie są potrzebne do renderowania, jak np. węzeł DOM lub ID opóźnienia (ang. timeout). W przeciwieństwie do stanu, zmiana wartości referencji nie powoduje ponownego przerenderowania komponentu. Referencje są niejako “ukrytą furtką”, pozwalającą wyjść poza paradygmaty Reacta. Przydają się, gdy potrzebujesz skorzystać z systemów nie-reactowych, jak choćby API wbudowane w przeglądarkę.

  • useRef deklaruje referencję. Możesz w niej trzymać dowolną wartość, lecz zwykle używa się jej do przechowywania węzła DOM.
  • useImperativeHandle pozwala dostosować referencję wystawianą przez twój komponent. Rzadko używany.
function Form() {
const inputRef = useRef(null);
// ...

Hooki efektu

Efekty pozwalają komponentowi połączyć się i zsynchronizować z zewnętrznymi systemami. Mowa tu o sieci, DOM przeglądarki, animacjach, widgetach napisanych przy użyciu innej biblioteki czy innego kodu nie-reactowego.

  • useEffect łączy komponent z systemem zewnętrznym.
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]);
// ...

Efekty są “ukrytą furtką”, pozwalającą wyjść poza paradygmaty Reacta. Nie używaj ich do organizowania przepływu danych w aplikacji. Jeśli nie wchodzisz w interakcję z systemem zewnętrznym, możesz wcale nie potrzebować efektu.

Istnieją dwa rzadko używane wariacje hooka useEffect, różniące się momentem wywołania:

  • useLayoutEffect jest wywoływany zanim przeglądarka wykona ponowne rysowanie treści strony. Można w nim mierzyć elementy układu strony.
  • useInsertionEffect jest wywoływany zanim React wprowadzi zmiany do DOM. Biblioteki mogą za jego pomocą wstrzyknąć dynamiczne style CSS.

Hooki wydajnościowe

Powszechnie stosowanym zabiegiem, mającym na celu optymalizację wydajności renderowania, jest pominięcie zbędnej pracy. Na przykład, możesz poinstruować Reacta, aby użył poprzednio obliczonej wartości lub aby nie renderował ponownie komponentu, jeśli dane nie zmieniły się od ostatniego renderowania.

Aby pominąć obliczenia i niepotrzebne renderowania, użyj jednego z poniższych hooków:

  • useMemo pozwala zapamiętać wynik kosztownych obliczeń.
  • useCallback pozwala zapamiętać definicję funkcji przed przekazaniem jej do zoptymalizowanego komponentu.
function TodoList({ todos, tab, theme }) {
const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]);
// ...
}

Czasami nie można pominąć ponownego renderowania, ponieważ ekran mimo wszystko musi zostać zaktualizowany. W takim przypadku możesz poprawić wydajność poprzez rozdzielenie blokujących aktualizacji, które muszą być synchroniczne (np. wpisywanie przez użytkownika tekstu do pola) od nieblokujących, które nie muszą blokować interfejsu (np. aktualizacja wykresu).

Aby spriorytetyzować renderowanie, użyj jednego z tych hooków.

  • useTransition pozwala oznaczyć zmianę stanu jako nieblokującą, co umożliwia innym zmianom na przerwanie jej.
  • useDeferredValue pozwala opóźnić aktualizację niekrytycznej części interfejsu na rzecz innych.

Hooki zasobów

Do zasobów można dostać się z poziomu komponentu bez konieczności tworzenia dla nich stanu lokalnego. Na przykład, komponent może odczytywać wiadomość z Obietnicy (ang. Promise) albo informacje o stylu z kontekstu.

Aby odczytać wartość z zasobu, użyj tego Hooka:

function MessageComponent({ messagePromise }) {
const message = use(messagePromise);
const theme = use(ThemeContext);
// ...
}

Inne hooki

Te hooki przydają się zwykle tylko autorom bibliotek i nieczęsto spotyka się je w kodzie aplikacyjnym.

  • useDebugValue pozwala zmienić etykietę twojego własnego hooka, którą wyświetlają React DevTools.
  • useId pozwala komponentowi przypisać do siebie unikalny identyfikator. Zwykle używane w połączeniu z API dostępności (ang. accessibility).
  • useSyncExternalStore pozwala komponentowi na zasubskrybowanie się do magazynu zewnętrznego.

Twoje własne hooki

Możesz także zdefiniować swoje własne hooki jako funkcje javascriptowe.