Skocz do treści

React Hooks: useState, czyli stan w komponentach funkcyjnych

100

Wbudowanych Hooków w React jest kilka, a jeszcze więcej możesz tworzyć sam(a). Zaczniemy jednak od podstawowego wbudowanego Hooka useState. Dodamy stan do komponentu funkcyjnego!

Ten artykuł jest częścią 34 z 41 w serii React.js.

Zdjęcie Michał Miszczyszyn
JavaScript2 komentarze

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:

  1. To stan
  2. 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:

https://typeofweb.com/react-js-w-przykladach-filtrowanie-statycznej-listy/

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?

👉  Znalazłeś/aś błąd?  👈
Edytuj ten wpis na GitHubie!

Autor