od Podstaw
5 godz. 59 min · ReactJS · Full-stack i Programowanie
Michał JabłońskiReact przeszedł długą ścieżkę rozwoju i część z jego funkcjonalności nie są już powszechnie używane. Dlatego w tym kursie skupimy się na najnowszych technikach pracy z biblioteką - poznasz współczesne podejście do budowania komponentów z wykorzystaniem hooks (useState, useEffect), zrozumiesz zasady kompozycji i zarządzania stanem aplikacji. Pokażemy Ci też jak efektywnie korzystać z narzędzi deweloperskich, debugować kod i wdrażać aplikacje na produkcję z użyciem współczesnych platform jak Vercel.
Hooki to fundament nowoczesnego Reacta, który całkowicie zmienił sposób tworzenia komponentów. W kursie nauczysz się efektywnie zarządzać stanem aplikacji używając useState, wykorzystywać useEffect do operacji lifecycle i side-effects, oraz poznasz reguły korzystania z hooków. Wszystko to przećwiczysz w praktycznych zadaniach, takich jak implementacja filtrowania listy elementów, gdzie zastosujesz zdobytą wiedzę w realnym scenariuszu.
Obsługa formularzy to nieodłączny element każdej aplikacji webowej. Pokażemy Ci jak kontrolować wartości pól input, wykorzystać popularną bibliotekę Formik do zarządzania złożonymi formularzami oraz implementować walidację danych. Wiedza ta zostanie utrwalona poprzez praktyczne zadanie, w którym rozwiniesz formularz o dodatkowe pola i zastosujesz poznane techniki w rzeczywistym przypadku użycia.
Większość aplikacji wymaga komunikacji z serwerem. Nauczysz się jak poprawnie wykonywać operacje asynchroniczne w komponentach React, obsługiwać stany ładowania i błędów, oraz efektywnie korzystać z klienta HTTP do zapytań AJAX. Zaczniesz od pracy z przygotowanym mockiem API, by następnie przejść do prawdziwej integracji z back-endem. W praktycznym zadaniu zaimplementujesz pełny przepływ danych - od pobrania, przez wyświetlenie, aż po wysłanie na serwer.
Poza budową aplikacji React, w kursie znajdziesz także moduł poświęcony wdrażaniu aplikacji na produkcję. Poznasz prawidłową konfigurację serwera produkcyjnego dla architektury SPA, nauczysz się zarządzać zmiennymi środowiskowymi poprzez pliki .env oraz przeprowadzisz deployment na platformie Vercel. Dzięki temu Twoja aplikacja będzie nie tylko działać lokalnie, ale także będzie gotowa do użycia przez realnych użytkowników w internecie.
Nowoczesny React stworzyliśmy z myślą o osobach, które chcą nauczyć się Reacta i jednocześnie znają JavaScript. Niezależnie od tego, czy React jest Twoim pierwszym frameworkiem, czy masz już doświadczenie w pracy np. ze Svelte czy Vue, ten materiał jest dla Ciebie. Wskazane jest również posiadanie ogólnej wiedzy na temat tworzenia interfejsów z HTML i CSS oraz obsługi narzędzi takich jak Git czy podstawy pracy z terminalem.
Rozpatrzmy sobie następujący problem.
Gdybym chciał przetestować, czy np.
Isloading wyświetla się poprawnie w trakcie projektowania tej aplikacji,
to oczywiście mógłbym zmienić stan.
Widzimy, że to się bardzo szybko tutaj odświeża.
Mogę sobie to zmienić z false na true, ale nie do końca, bo przecież ten use
effect steruje tym jest loading.
Co by było, gdybym chciał zobaczyć, czy faktycznie dobrze sobie tutaj kombinuję?
Chciałbym zobaczyć właśnie loading people.
Zauważ, że ja zastosowałem sztuczkę z trolingiem, czyli spowolniłem sobie
internet tylko i wyłącznie po to, żeby zobaczyć sobie czy
wszystko działa poprawnie.
I to loading people zostało tutaj wyświetlone.
Okazuje się jednak, że możemy do tego dojść troszeczkę inaczej.
Możemy właśnie debugować sobie aplikację i podmieniać jej propsy i
stan, jeśli tylko chcemy.
Musimy w tym celu użyć tzw.
dev tool React w swojej dokumentacji Tutaj w zakładce Learn Installation mamy
coś takiego jak React Developer Tools.
I to jak Developer Tools pozwala Ci zainstalować w zależności od
tego jaką masz przeglądarkę.
Ja mam przeglądarkę opartą na Chromium, więc dodam to sobie właśnie tutaj.
Jeżeli dodam rozszerzenie, to zwróć uwagę, że będziemy mogli teraz
mieć dodatkowe elementy.
Czyli mamy dodany właśnie tą wtyczkę.
Tą wtyczkę możemy sobie tutaj przypiąć.
Zobaczmy sobie jak ona działa i zobaczmy to sobie w naszej aplikacji.
Często jest tak, że musimy sobie dodatkowo odświeżyć tego taba.
Widzimy, że tutaj mamy React Developer Tools ma dostęp do tej strony.
Co więcej, React Developer Tools będzie miał dostęp tylko do stron,
które są w fazie developmentu.
Czyli w momencie gdy wybudujemy sobie produkcję to React Developer
Tools już Ci nie pomoże.
Natomiast zobaczmy jak one sobie działają.
Gdybyśmy otworzyli sobie F12, czyli tutaj mamy zobacz nowe narzędzie
Components i Profiler.
Nam potrzebny jest Components i tutaj możemy bardzo podobnie jak masz taki
selector, który zaznacza Ci inspektorem.
Właśnie tutaj możesz sobie biegać po stronie, zaznaczać.
Tak samo tutaj w Components mamy taki komponent Inspector i możemy
sobie zaznaczać nasze komponenty.
Ja bym chciał zobaczyć sobie to list of people na przykład.
I to jest moje people page.
I zobacz, że na tym People page mamy tutaj propsy, które mamy i hugs,
czyli mamy nasz stan.
I zobacz, że tutaj możemy sobie modyfikować stan i sprawdzać sobie
na przykład tą wartość is loading.
Zwróć uwagę, że teraz mogę sobie jak gdyby przestawić wartość is loading
właśnie z tego state u.
I tutaj jak gdyby to jest drugi element, który mi się uruchomił, czyli muszę sobie
to zobaczyć w ten sposób, że tutaj jako pierwszy mam people, jako drugie jest is
loading i to jest loading mam właśnie tutaj, czyli to jest state true.
Zmieniam sobie to natychmiastowo. Strona false.
Zobacz, że mam też dostęp do stanu, gdzie mógłbym sobie edytować pewne
wartości, które tutaj są.
Widzimy, że tutaj mam dostęp na przykład do Ewa.
Chciałbym sobie to wykasować i na przykład Johna też likwidujemy z tego stanu.
Co się stało?
Oczywiście to natychmiastowo ma efekt na widoku, czyli na widoku.
Mogę sobie to sprawdzić, edytować.
Mógłbym też zobaczyć, co się dzieje z aplikacją.
Na przykład jak zmienię search.
Zobacz, że Search text jest tutaj przedostatnim z Use
State u, który używamy.
Spróbujmy sobie to zmodyfikować i zobaczmy jak aplikacja wtedy się zachowuje.
Czyli tutaj w Components zaznaczmy sobie właśnie ten komponent.
To jest moje people page.
I tutaj zauważ, wrzucę sobie właśnie jakiś tekst jako test.
W momencie, gdy sobie to zaktualizuję, widzimy, że nie aktualizuje mi
się on tutaj na tym Searchbarze. Dlaczego?
Dlatego, że zwróć uwagę, że nie korzystaliśmy tam kompletnie ze stanu.
Czyli widzimy tutaj Ten prosty test pokazuje nam, że to nie jest control
komponent, czyli input nie jest tutaj kontrolowany.
Co za tym idzie w Searchboxie Boxie.
Tutaj nie korzystamy po prostu ze stanu, który aktualizowałby tą wartość
walił w inpucie, która byłaby tutaj.
Nie musimy tego robić.
Akurat to jest taki test tego, że filtrowanie nam działa.
Czyli jeśli tutaj wpiszemy na przykład mar, powinniśmy dostać marka.
Natomiast widzimy, że to filtrowanie działa niezależnie od tego,
jaka tu jest wpisana wartość.
Innymi słowy, możemy sobie tutaj oczywiście spróbować przetestować,
skasować te rzeczy i to nasze UI działa poprawnie.
Natomiast widzimy, że jak gdyby ten prosty test wykazuje, że ten input nie jest
kontrolowany, czyli jego value nie zależy od tego stanu, który mamy tutaj.
Żeby tak było, musielibyśmy zrobić w ten sposób coś mniej więcej takiego, że ten
Searchtext musiałby być przekazywany w jakiś sposób do tego właśnie naszego
Searchboxa i w drugą stronę, więc w taki sposób musielibyśmy to zrobić.
Natomiast akurat w naszej aplikacji nie ma takiego wymogu, żeby tak było.
Możemy to zostawić właśnie w ten sposób.
Zauważ, że możemy testować również inne widoki, Czyli gdybyśmy mieli np.
Ad person zobaczymy, że ten outlet nam się zmienia.
Widzimy dokładnie co się dzieje i to ad page, że tutaj jest.
Widzimy, że ono ma swój page layout.
I tutaj dla przykładu spróbujmy sobie zmienić props.
Czyli widzisz, że propsy są tutaj z nazwy wymienione.
Czyli jeśli nie używamy huków, dostajemy z nazwy te elementy, które
tutaj są przesłane.
Mamy tutaj coś takiego jak title i możemy sobie zmienić to na przykład na Hello.
To powinno nam się wtedy zaktualizować i widzimy jak to działa, jak korzystać
z tego narzędzia i dlaczego.
Myślę, że widzisz już potencjał w tym narzędziu.
Potencjał polega na tym, że możemy sobie w ten sposób debugować pewne elementy.
Może się okazać, że na przykład coś nie działa nam tak, jakbyśmy chcieli, Coś nie
przekazuje się przez propsy i zamiast konsolidować te elementy, możemy sobie
sprawdzić, czy dobrze sobie to zrobiliśmy, czy dobrze sobie zaprojektowaliśmy.
Tutaj na przykład możemy do prototypowania użyć tego narzędzia.
Załóżmy, że chcemy tutaj wpisać sobie jakiś error message, czyli tutaj mamy
error, Jeśli go sobie tutaj dopiszemy, to widzimy co się dzieje.
Czy ten nasz box się pojawia?
Czy ten message się faktycznie pojawia w momencie, gdy mamy błąd?
Widzimy również, że zniknął nam Searchbar.
Czyli niezależnie od tego czy to isloading jest włączony czy nie, prawda?
Znaczy jest, loading się pojawi.
Natomiast jeżeli isloading jest ustawiony na false, a nasz error jest tutaj, możemy
sobie sprawdzić właśnie tą wartość.
Zobacz czy to działa poprawnie.
Mamy error, więc searchbar nie pojawia się.
Ten Searchbox nie będzie tutaj dostępny.
Możemy sobie też ten error wyzerować, czyli zrobić z niego pustego stringa i
widzimy, że wtedy wszystko działa ponownie.
Czyli mamy tutaj hooki, mamy ich kolejność.
Pamiętaj, że ta kolejność jest istotna dla Reacta i tutaj w devtoolach dostaniesz je
w tej kolejności, w której zostały tutaj wywołane, więc w ten sposób możemy sobie
próbować debugować tą stronę i sprawdzać, modyfikować jej wartości w zależności
od tego, co jest nam potrzebne.
I widzimy też ułożenie naszych komponentów.
Możemy też sprawdzić wygenerowane klucze dla każdego komponentu.
Zobacz, że tutaj mamy klucze, które są ID.
Zainwestowaliśmy właśnie w ID, żeby te bloki miały klucze typu ID z naszego
backendu i to nam faktycznie elegancko tutaj działa.
Możemy sobie podejrzeć ok.
Tutaj możemy sobie zauważyć na przykład na konsoli mamy ID child at least should have
unique prop, czyli check render of people page, see for more information.
Czyli mamy tutaj panel block, który gdzieś nam powtarza się ten sam klucz.
Musielibyśmy zobaczyć, czy na przykład nie mamy powtórzeń ID w naszym DB JSON.
Być może tak się złożyło, że któryś z naszych ID się tutaj powtarza,
to wtedy winą obarczylibyśmy.
Zobaczmy sobie to właśnie w narzędziach deweloperskich.
Winą obarczylibyśmy chyba nasz JSON Server.
Sprawdźmy to jeszcze w naszym DB JSON.
Nie mamy tutaj Powtórzonego ID, a więc prawdopodobnie efektem tego działania jest
przygotowany przez nas skeleton values, czyli to, co mamy tutaj.
Tutaj musielibyśmy sobie w tym make empty person przygotowywać jakieś randomowe ID.
To randomizowanie tutaj nie będzie nam przeszkadzało w momencie, w którym
będziemy sobie przygotowywać skeleton values, ponieważ robimy to jednorazowo.
Zwróć uwagę, że owszem, te wartości są randomizowane, ale one są zrobione
jednorazowo w momencie, gdy aplikacja startuje.
Więc mamy make person z ID, które są losowane, ale to losowanie jest jak gdyby
tylko w momencie startu naszej aplikacji.
To, czego nie możemy robić, czyli to id random, które mielibyśmy tutaj w Kluczach,
nie możemy robić tu w tym miejscu. Czyli tutaj.
Nie mogę tego randomizować za każdym razem, gdybym chciał
sobie przypisać klucz.
Znaleźliśmy więc problem, który wynika z tego, że tutaj nie dostarczyliśmy
sobie ID ków do tego make and person.
Zobaczmy czy teraz wszystko działa poprawnie.
Zauważ, że jest to akurat problem, którego nie byliśmy w stanie wychwycić tutaj
podczas sprawdzania tego components, Ale z kolei poszliśmy w drugą stronę, czyli
zauważyliśmy, że tutaj każdy z tych kluczy jest unikatowy, jest prawidłowy.
Sprawdziliśmy to jeszcze dodatkowo w DB JSON.
Natomiast skoro tak, to ostatnim elementem, który nam pozostał do
sprawdzenia jest to, że właśnie ten filtr People będzie na bazie oczywiście People.
Z kolei People składamy sobie jako stan początkowy, który jest tutaj w State.
I tutaj zabrakło nam po prostu ID ków.
To jest nam potrzebne tylko z punktu widzenia Skeletona, ale znaleźliśmy pewien
błąd i byliśmy w stanie go poprawić.
Właśnie do tego typu celów używamy narzędzi dev Tools do sprawdzenia sobie
widoków, do podmiany stanu i do podmiany propsów oraz debugowania aplikacji.