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:
useStatedeklaruje zmienną stanu, którą można zmieniać bezpośrednio.useReducerdeklaruje zmienną stanu wraz z logiką jej aktualizacji zawartą w funkcji redukującej (ang. reducer function).
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.
useContextodczytuje 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ę.
useRefdeklaruje referencję. Możesz w niej trzymać dowolną wartość, lecz zwykle używa się jej do przechowywania węzła DOM.useImperativeHandlepozwala 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:
useLayoutEffectjest wywoływany zanim przeglądarka wykona ponowne rysowanie treści strony. Można w nim mierzyć elementy układu strony.useInsertionEffectjest 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:
useMemopozwala zapamiętać wynik kosztownych obliczeń.useCallbackpozwala 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.
useTransitionpozwala oznaczyć zmianę stanu jako nieblokującą, co umożliwia innym zmianom na przerwanie jej.useDeferredValuepozwala 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:
usepozwala na odczytanie wartości zasobu, takiego jak Obietnica (ang. Promise) lub kontekst.
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.
useDebugValuepozwala zmienić etykietę twojego własnego hooka, którą wyświetlają React DevTools.useIdpozwala komponentowi przypisać do siebie unikalny identyfikator. Zwykle używane w połączeniu z API dostępności (ang. accessibility).useSyncExternalStorepozwala komponentowi na zasubskrybowanie się do magazynu zewnętrznego.
Twoje własne hooki
Możesz także zdefiniować swoje własne hooki jako funkcje javascriptowe.