Menu

Hooki w React: wszystkie hooki na żywych przykładach

Hook to funkcja, której nazwa zaczyna się od use i która pozwala komponentowi korzystać z funkcji Reacta, takich jak stan, kontekst, refy czy efekty. Zobacz wszystkie wbudowane hooki pogrupowane według przeznaczenia, dwie zasady, których przestrzega każdy hook, i to, jak napisać własny.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Hooki w React to funkcje, których nazwy zaczynają się od use i które pozwalają komponentowi funkcyjnemu korzystać z funkcji Reacta: useState, żeby zapamiętać wartość, useEffect, żeby uruchomić kod po renderowaniu, useRef, żeby trzymać węzeł DOM, useContext, żeby odczytać wspólne dane. Wywołujesz je na początku komponentu, a React zachowuje ich wartości między renderowaniami.

Współpracują tu cztery hooki. useState przechowuje tekst, useRef wskazuje na pole, żeby przycisk mógł ustawić na nim fokus, useMemo trzyma przefiltrowaną listę, dopóki nie zmieni się zapytanie, a useEffect wypisuje log po każdym renderowaniu, w którym zapytanie się zmieniło. Wpisz an i obserwuj konsolę: jedna linia na każde naciśnięcie klawisza, po aktualizacji listy.

Dlaczego istnieją hooki

Przed React 16.8 komponent, który potrzebował stanu albo kodu cyklu życia, musiał być klasą. Logika jednej funkcji była rozdzielona między componentDidMount, componentDidUpdate i componentWillUnmount, a współdzielenie jej między komponentami oznaczało mixiny (które nigdy nie działały ze składnią klas), komponenty wyższego rzędu albo render propsy, a każde z tych rozwiązań owijało drzewo w dodatkowe warstwy.

// The class way: one feature, three methods
class Clock extends React.Component {
    state = { now: new Date() };
    componentDidMount() {
        this.id = setInterval(() => this.setState({ now: new Date() }), 1000);
    }
    componentWillUnmount() {
        clearInterval(this.id);
    }
    render() {
        return <p>{this.state.now.toLocaleTimeString()}</p>;
    }
}

Z hookami ta sama funkcja żyje w jednym miejscu: efekt uruchamia timer, a jego funkcja czyszcząca go zatrzymuje.

Ukryj zegar, a konsola wypisze timer stopped: React uruchomił funkcję czyszczącą, gdy Clock zniknął z ekranu. Pokaż go ponownie, a wystartuje świeży timer. Komponenty klasowe nadal działają w React 19, ale nowy kod używa hooków.

Wszystkie wbudowane hooki

React 19.2 grupuje swoje hooki według tego, co dają komponentowi. Pierwszych dwóch grup będziesz używać codziennie, a reszty wtedy, gdy wymaga tego konkretny problem.

HookCo dajeStrona
useStateWartość, która przetrwa renderowanie, i setter, który renderuje ponownieuseState
useReducerStan aktualizowany przez funkcję reduktora i wysyłane akcjeuseReducer
useContextWartość dostarczoną przez rodzica, bez przekazywania propsówuseContext
useRefZmienne pudełko, które przetrwa renderowanie, często węzeł DOMuseRef
useImperativeHandleWybiera, co rodzic widzi przez twój refforwardRef
useEffectKod uruchamiany zwykle po odmalowaniu: timery, subskrypcje, pobieranie danychuseEffect
useLayoutEffectKod uruchamiany po aktualizacji DOM, ale przed odmalowaniemuseLayoutEffect
useInsertionEffectUruchamia się przed efektami układu, dla bibliotek CSS-in-JS
useEffectEventFunkcja, którą może wywołać efekt i która zawsze widzi najnowsze propsy i stanuseEffect
useMemoZapamiętuje wyliczoną wartość między renderowaniamiuseMemo
useCallbackZapamiętuje funkcję między renderowaniamiuseCallback
useTransitionOznacza aktualizację jako niepilną i mówi ci, kiedy jest w tokuuseTransition
useDeferredValueKopia wartości, która zostaje w tyle przy ciężkich renderowaniachuseDeferredValue
useIdUnikalne id, które zgadza się na serwerze i kliencieuseId
useSyncExternalStoreSubskrybuje magazyn danych, który żyje poza ReactemuseSyncExternalStore
useDebugValueEtykieta dla własnego hooka w React DevTools
useOdczytuje obietnicę albo kontekst i może stać w warunkuuse
useActionStateStan aktualizowany przez akcję formularza, z flagą oczekiwaniauseActionState
useOptimisticPokazuje oczekiwany wynik, zanim odpowie serweruseOptimistic
useFormStatusStan oczekiwania formularza rodzica (z react-dom)

use, useActionState, useOptimistic i useFormStatus pojawiły się w React 19, a useEffectEvent stał się stabilny w 19.2. Każdy inny hook z listy działa też w React 18.

Stan renderuje, refy nie

Nie każdy hook wywołuje renderowanie. useState i useReducer tak: zmień ich wartość, a React narysuje komponent ponownie. useRef daje ci obiekt, którego pole current możesz swobodnie zmieniać, a React nigdy przez to nie renderuje ponownie. Dlatego to właściwe miejsce na ID timera, poprzednią wartość albo licznik, którego ekran nie pokazuje.

useReducer trzyma koszyk, a useState notatkę; oba powodują renderowanie, gdy się zmieniają, a efekt wypisuje jedną linię na renderowanie. Efekt zmienia też commits.current, a jednak ta zmiana nigdy sama nie powoduje renderowania, więc log się nie zapętla. Licznik jest aktualizowany w efekcie, a nie w ciele komponentu, bo ciało nie powinno niczego zmieniać podczas renderowania.

Zasady hooków

Każdy hook przestrzega dwóch zasad:

  1. Wywołuj hooki na najwyższym poziomie komponentu, nigdy w warunku, pętli ani zagnieżdżonej funkcji.
  2. Wywołuj hooki tylko z komponentów funkcyjnych albo z własnych hooków.

React nie rozpoznaje hooków po nazwie. Rozpoznaje je po kolejności wywołań i oczekuje, że ta kolejność będzie taka sama przy każdym renderowaniu. Hook w if przesunąłby każdy hook po nim. Strona o zasadach hooków pokazuje, co się psuje i jak to naprawić. use to jedyny wyjątek: można go wywołać w warunku.

Twój pierwszy własny hook

Gdy dwa komponenty potrzebują tej samej logiki ze stanem, przenieś ją do funkcji, której nazwa zaczyna się od use. Ta funkcja może wywoływać dowolny inny hook. Każdy komponent, który ją wywołuje, dostaje własny stan.

Oba liczniki uruchamiają ten sam hook, ale kliknięcie jednego zostawia drugi w spokoju: własny hook współdzieli logikę, a nie stan. Dodaj do useCounter funkcję decrement i przycisk, który ją wywołuje, a oba liczniki dostaną ją naraz. Więcej wzorców (useToggle, useDebounce, useLocalStorage) znajdziesz na stronie o własnych hookach.

Po który hook sięgnąć

  • Ekran ma się zmienić, gdy zmienia się wartość: useState albo useReducer, gdy wiele zdarzeń aktualizuje ten sam stan.
  • Musisz porozumieć się z czymś spoza Reacta (timer, subskrypcja, żądanie): useEffect.
  • Potrzebujesz węzła DOM albo wartości, której ekran nie pokazuje: useRef.
  • Wiele komponentów głęboko w drzewie potrzebuje tej samej wartości: useContext.
  • Renderowanie jest wolne przez jedno obliczenie albo dlatego, że zmemoizowane dziecko renderuje się ponownie: useMemo i useCallback. React Compiler może dodać tę memoizację za ciebie, ale pisanie jej ręcznie nadal działa i nadal jest powszechne.
  • Pisanie wydaje się opóźnione, bo aktualizacja za nim jest ciężka: useTransition albo useDeferredValue.

Najczęściej zadawane pytania

Co to są hooki w React?

Hooki to funkcje, których nazwy zaczynają się od use i które pozwalają komponentowi funkcyjnemu korzystać z funkcji Reacta: useState do stanu, useEffect do efektów ubocznych, useContext do kontekstu, useRef do wartości, które przetrwają renderowanie, nie powodując go, i innych.

Dlaczego do Reacta dodano hooki?

Przed hookami (React 16.8) stan i metody cyklu życia istniały tylko w komponentach klasowych, a współdzielenie logiki ze stanem wymagało mixinów, komponentów wyższego rzędu albo render propsów. Hooki umieszczają tę logikę w zwykłych funkcjach, które możesz wywołać z dowolnego komponentu funkcyjnego i współdzielić jako własne hooki.

Ile hooków ma React?

React 19.2 dostarcza około dwudziestu wbudowanych hooków w pakiecie react oraz useFormStatus w react-dom. Większość aplikacji na co dzień używa kilku: useState, useEffect, useRef, useContext, useMemo i useCallback.

Czy mogę używać hooków w komponentach klasowych?

Nie. Hooki działają tylko wewnątrz komponentów funkcyjnych i innych hooków. Nadal możesz renderować komponent klasowy obok funkcyjnych, a klasa może renderować komponent funkcyjny, który używa hooków.

Co to jest własny hook?

Twoja własna funkcja, której nazwa zaczyna się od use i która wywołuje inne hooki. Pozwala kilku komponentom używać tej samej logiki ze stanem, a każdy komponent, który ją wywołuje, nadal dostaje własny, osobny stan.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ