Komponenty funkcyjne
Na początek krótka informacja od twórców React. Do tej pory komponenty będące funkcjami nazywały się Stateless Functional Component. Od momentu wprowadzenia Hooków ta nazwa nie miałaby dłuższej sensu. Dlatego od teraz takie komponenty nazywamy Function Component.
useState — stan
Zgodnie z konwencją, nazwy React Hook zaczynają się od słowa use. Mamy więc useState
, useEffect
, useContext
itd. W tym wpisie będę mówił tylko o tym pierwszym, kolejne wkrótce :)
Weźmy pierwszy najprostszy przykład z hookami: Dodanie stanu do komponentu funkcyjnego. Zróbmy licznik ;)
function App() {
const [counter, setCounter] = React.useState(0);
return (
<div>
{counter}
<button onClick={() => setCounter(counter + 1)}>+</button>
</div>
);
}
Co tu się dzieje? Wywołuję funkcję React.useState(0);
. Jest to Hook. Ten Hook zwraca tablicę z dwoma elementami:
- To stan
- To funkcja zmieniająca stan
Użyłem tutaj destrukturyzacji tablicy i nazwałem stan counter
, a funkcję zmieniającą stan setCounter
. Jest to zgodne z konwencją, ale w zasadzie te nazwy mogłyby być zupełnie dowolne.
Dodatkowo, warto zwrócić uwagę, że useState
jako argument przyjmuje stan początkowy — w moim przypadku liczbę 0.
Stała counter
zawiera aktualny stan. Na początku jest to stan początkowy, czyli 0. Jeśli wywołam funkcję setCounter(…)
to stan zostanie zmieniony i w kolejnym renderze counter
będzie zawierał nową wartość.
Sprawdźmy jak to działa w praktyce:
Ale co to w ogóle jest Hook?
Abstrakcyjnie: Hooki to mechanizm mocno inspirowany State Monad z Haskella. Pozwalają na przechowywanie stanu pomiędzy kolejnymi wywołaniami funkcji, bez konieczności martwienia się mutacjami czy jakimiś referencjami.
Jak to działa pod podszewką? W telegraficznych skrócie: React wywołuje Twoją funkcję (komponent funkcyjny) i może przechowywać sobie związany z nią stan. Przed wywołaniem komponentu funkcyjnego, React wie dokładnie, który komponent jest wywoływany i który stan powinien zostać „włożony” do Hooków. Po zakończeniu wywołania funkcji, React sprawdza czy stan się zmienił i odkłada na odpowiednie miejsce. React robi za Ciebie dokładnie to, co do tej pory było robione manualnie przez Ciebie w metodach cyklu życia. To ogromne ułatwienie!
Filtrowanie listy z Hookami
Wróćmy do przykładu, który był implementowany w tym kursie już 2 razy:
Zamiast używać klasy, setState
i this.state
, użyj Hooka useState
. Pomijam fragmenty, które się powtarzają w stosunku do starego kodu:
function App() {
const [filteredUsers, setUsers] = React.useState(allUsers);
function filterUsers(e) {
const text = e.currentTarget.value;
const filteredUsers = getFilteredUsersForText(text);
setUsers(filteredUsers);
}
return (
<div>
<input onInput={filterUsers} />
<UsersList users={filteredUsers} />
</div>
);
}
W momencie wpisania czegoś w input, wywoływana jest funkcja filterUsers
, która filtruje listę i wywołuje setUsers
pochodzące z Hooka. Ot, cała filozofia. Stan jest gdzieś przechowywany i nie bardzo obchodzi nas gdzie. To po prostu działa.
Pytania?
zapisz się na szkolenie z React. Jeśli chcesz na bieżąco śledzić kolejne części kursu React.js to koniecznie polub mnie na Facebooku i zapisz się na newsletter.
Ćwiczenie
Ćwiczenie: Przepisz jakiś komponent z klasy na Hooka useState
. Jak wrażenia?