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.
Czasami w naszej aplikacji mamy chęć zobaczenia jak ona działa, bez
konieczności konsultowania wszystkiego, co mamy wewnątrz.
Czyli są pewne informacje, na przykład takie jak data.
Chcielibyśmy zobaczyć, co faktycznie tutaj się znajduje i zamiast konsolidować to czy
konsolidować, chcielibyśmy zobaczyć, czym jest data, jak ona wraca tutaj stąd.
Natomiast jak to zrobić?
Moglibyśmy sobie pomyśleć, że ok, można by było debugować aplikację.
Czyli jeśli postawię sobie tutaj tak zwanego break pointa, no to jakby naiwnie
myśląc, mógłbym założyć, że jeżeli teraz odświeżę aplikację, to ona mi się
zatrzyma dokładnie w tym miejscu.
Niestety tak to nie działa.
Nie działa tak dlatego, że debugger nie został jeszcze ustawiony,
żeby ustawić debugger.
I to niezależnie od tego, czy mamy do czynienia z aplikacją Reactową,
czy z inną frontendową aplikacją.
Potrzebujemy dwóch rzeczy.
Po pierwsze musimy znać adres lokalnego deweloperskiego serwera, czyli to jest
nasz serwer właśnie z naszym frontendem.
Czyli tutaj mamy na tym porcie 5.173 Osadzony serwer deweloperski i tutaj
będziemy chcieli się podczepić. To jest pierwsza rzecz.
A druga rzecz to faktyczne uruchomienie debuggera.
Jeśli chodzi o narzędzia typu JetBrains, czyli Web Store Intelligence,
robimy to w Edit Configuration i tutaj dodajemy sobie JavaScript Debug.
Trzeba tutaj w tych konfiguracjach znaleźć sobie.
JavaScript debug i tutaj potrzebujemy jak najbardziej tego adresu.
Jest on konieczny, żeby debugger wiedział na jakim serwerze ma się ustawić,
na jakim porcie i gdzie dokładnie.
Czyli innymi słowy nasze dev musi cały czas pracować, żeby zadziałał debugger.
Inaczej niestety to nie zadziała.
Można sobie nazwać to na przykład debug tutaj ok.
I uwaga klikamy tego robaczka nie znaczek play, tylko klikamy w ten
znaczek robaczka tutaj.
I teraz zauważ, że debugger nam się uruchamia w tym miejscu
uruchomi nam nową przeglądarkę.
Ta przeglądarka osadzi się na porcie 5173 i tutaj już mamy posting debugger.
No i teraz mamy całą gamę możliwości, dlatego, że możemy chociażby
modyfikować to data.
Co by było gdybym ja tutaj chciał sobie zmodyfikować to data?
Zrobił setValue.
Ale na przykład chciałbym zmodyfikować sobie cały obiekt, czyli robimy sobie
tutaj setValue i zrobimy sobie, że tu jest name i ID np.
2 Wtedy zobaczymy sobie to ewentualnie na kluczu.
W momencie gdy kliknę Play to aplikacja pójdzie dalej.
Co by było gdybym chciał sobie ją zatrzymać?
Wystarczy, że będę miał kolejny breakpoint.
Zauważ, że jeśli ustawię sobie kolejny breakpoint na przykład tutaj finally,
wiemy o tym, że catch się nie wywoła, dlatego, że tutaj nie
mamy żadnego jeziora.
Możemy sobie podejrzeć te dane, które tutaj do nas przyszły i
analizować je sobie krok po kroku.
Natomiast zobacz, że tutaj możemy sobie przejść dalej.
Mam breakpoint i jak gdyby puszczam dalej aplikację.
Ona jest właśnie tutaj.
Mógłbym też wykorzystać coś innego, to znaczy, gdybym wyszedł na
chwilę z wywołania tego efektu.
Zobacz, zrobił sobie taki step over, to jesteśmy w tym miejscu.
Nie kliknąłem play dlatego, że nie mam kolejnego breakpointa.
Co prawda zatrzymałoby się to w tym miejscu dlatego, że komponent, przypomnę
ci używa Strict moda, więc stick modem opakowany komponent będzie
uruchamiał się dwukrotnie.
Przypominam Ci o modzie, który mamy tutaj właśnie w naszym main, czyli
mamy React Strict mode.
Polecam Ci znaleźć w dokumentacji jak dokładnie będzie
zachowywał się Strict mode.
Mamy tutaj to w Reference dokumentacji React DIV i tutaj musimy sobie
znaleźć components i Strict mode.
Tutaj będzie opisane dokładnie jak on działa.
Mamy tutaj też fantastyczne przykłady dlaczego właśnie potrzebujemy
tego strikte moda.
Mamy też przykłady, że nie musi on być na rucie naszej aplikacji, może być tylko we
fragmencie, jeśli byśmy chcieli i tam gdzie sobie projektujemy.
Tutaj jest taki fajny przykład, który pokazuje co się dzieje,
jeżeli zastosujemy mutację.
Czyli tutaj mamy pusha i mamy pewne problemy.
Ale to wszystko okaże się w momencie, w którym obejrzysz sobie właśnie ten
fragment dokumentacji, przejdziesz przez niego.
Polecam Ci właśnie tutaj dla React Strict Mode.
Wróćmy do naszego debuggera.
Nasz debugger jest osadzony w innym oknie przeglądarki.
I tutaj możemy sobie wrócić do Execution Pointa.
Możemy to sobie zrobić stąd i tutaj.
Show Execution point. Zobacz.
Jestem zupełnie gdzie indziej.
Robię show Execution Point i jestem w tym miejscu, w którym zatrzymałem się
z debugowanie mojej aplikacji.
I chciałbym tutaj na przykład zostawić sobie to loading people.
Jak to mogę zrobić?
Mogę wywołać sets loading z wartością true.
I okazuje się, że jest taka szansa.
Mogę zrobić evaluate expression i jeśli zrobię evaluate expression set is loading
i wrzucę sobie to na true, to ten kod jak najbardziej może się wykonać.
Zobaczmy Teraz puśćmy tą aplikację dalej.
Ona ma drugi render, więc jak gdyby zatrzyma nam się w tych dwóch punktach.
No i teraz tak.
Okazuje się, że zatrzymałem sobie tą aplikację przy pierwszej kolejce, czyli w
momencie gdy pierwszy raz się renderowała.
Czyli pierwsze wywołanie tego efektu.
Dlatego moje zmiany nie mają tutaj miejsca na widoku.
Zobaczmy jak to sobie zrobić poprawnie, Jeśli jeszcze raz to odświeżymy.
No to tu mamy ten pierwszy cykl i jego sobie pominiemy.
Czyli to jest raz. I dwa.
I teraz w drugim spróbujmy sobie w data coś podmienić.
Na przykład to Ewa.
Mogę sobie rozwinąć w data.
I tutaj w Name zróbmy sobie set value i jako Chris.
Przejdźmy sobie dalej.
I tutaj wyjdziemy sobie z tego Józefa.
Tu tylko po to, żeby wykonać sobie evaluate expression jeszcze raz, czyli
tutaj możesz sobie podejrzeć to, co było ostatnio wykonywane tutaj z
tego selecta rozwijanego tutaj.
Możemy sobie to zrobić i evaluate.
I zobaczmy jak to będzie działać.
Zobacz, że tutaj mam już loading people, bo to był ten drugi raz, kiedy już
komponent nie był wywołany za pierwszym razem w modzie.
Za drugim razem już był wyrenderowany, więc mamy loading people.
To zostało dlatego, że podmieniłem se this loading na true.
Pomimo tego, że to wszystko się już wykonało, to jak gdyby jeszcze
raz wywołałem ten seter.
No i druga sprawa Ewa jest podmieniona tutaj na wartość.
Chris.
Dlatego, że podmieniliśmy sobie to data, które tutaj było ustawiane i w ten
sposób możemy korzystać z debuggera.
W ten sposób możemy sobie ustawiać breakpointy.
Te breakpoint mogą być też enable disable, Czyli na przykład chcesz wiedzieć, że
podczas debugowania aplikacji korzystasz z tych dwóch, ale w tym momencie nie chcemy,
żeby aplikacja się tam zatrzymywała.
Czyli generalnie odświeżamy sobie i Enable disable Breakpoint znaczy mniej więcej
tyle, że po prostu jeżeli on jest disabled, no to wtedy jakby
nie zatrzyma nam aplikacji.
Częsty use case wykorzystania debuggera to moment, w którym wywołujemy jakieś akcje.
Bardzo często zauważysz, że dużo szybciej będzie Ci użyć debuggera, na przykład w
momencie, w którym sobie zrobimy tutaj ad Person page i chcielibyśmy sobie zobaczyć,
co dokładnie będzie w handleSubmit, co jest pod value.
Chcemy to bardzo szybko zobaczyć, więc tutaj ustawiamy sobie breakpoint.
I teraz w momencie, w którym klikamy Add widzimy wyraźnie, że to handle
submit się nie wywołuje.
Dopiero jak tutaj wpiszę jakieś wartości i wtedy kliknę tutaj add widzimy, że to
się zatrzymało i widzimy dokładnie, co reprezentuje sobą obiekt Values.
Mamy tutaj dostęp do Outer Scope.
Czyli zobacz, że mamy tutaj Unknown Scope.
Czyli to jest scope, który aktualnie tutaj nam działa.
W środku mamy jakiś local scope, którym mamy handle submit i tutaj mamy
values jako person name i email.
Widzimy dokładnie co się dzieje.
Dodatkowo możesz tutaj sobie wpisać nazwę np.
Values i chcemy sobie to values obserwować.
Tutaj dajesz wartość jakiegoś identifiera, czyli może być to zmienna, może być to
stała, może być to nazwa funkcji, którą spodziewasz się mieć w
danym scope, którym scope.
No właśnie nie wiadomo. No właśnie.
Może to być dowolny scope.
Czyli jeżeli w scope, który jest aktualnie ta wartość występuje, to dostaniesz jak
gdyby uzupełnienie tej wartości, co ona tutaj w sobie ma.
Innymi słowy, jeżeli przejdziemy gdzieś dalej, czyli zrobilibyśmy sobie
breakpointa w jakimś innym miejscu, to wtedy okazałoby się, że jeżeli byśmy
przeszli dalej, to to już nie będzie miało wartości.
Albo jeżeli ten breakpoint będzie w miejscu, w którym nie ma value.
Na przykład w Validator możemy zobaczyć sobie, kiedy validator
się wywołuje, prawda?
Więc tutaj weźmy sobie Hope.
Tutaj akurat też mamy values, więc będziemy mieli person name jako i email
jako puste, bo akurat tak się złożyło, że w tym scope mamy values i w tym scope też
mamy coś, co reprezentowane jest jako nazwa values.
Spróbujmy sobie po prostu podejrzeć w takim układzie actions.
Zobacz, jeżeli tutaj dopisze sobie actions do tej mojej wartości, którą chciałbym
sobie tutaj obserwować, no to mamy Reference error actions is not defined.
W przeciwieństwie do tego, jakbym tutaj chciał dopisać kolejną osobę.
Spróbujmy sobie tutaj zastosować tę sztuczkę, z tym, że ten właśnie
będzie disable i tutaj będzie Włodek.
I spróbujmy go sobie dodać.
To zobacz, że tutaj mamy z kolei actions, czyli mamy reset form ValidateForm,
ValidateFieldsets i tak dalej, i tak dalej.
Mamy tutaj całą gamę API, którą dostarcza formik, jesteśmy w stanie
sobie to podejrzeć.
Tutaj z tego miejsca widzimy jakie akcje możemy wywołać i tylko dlatego, że tutaj w
tym Scope actions jest i my mamy breakpoint, jesteśmy w stanie sobie
właśnie tutaj podejrzeć takim właśnie Watcher kiem.
Tutaj jesteśmy w stanie wymienić sobie te identifier y, które chcielibyśmy
mieć tutaj w tym konkretnym zakresie.
I tak w tych zakresach, w których będziemy mieli breakpointa.
Jeżeli to się nam zatrzyma, będziemy to właśnie widzieć.
Podsumowując musisz mieć działający serwer, musisz mieć konfigurację.
Jeżeli ta konfiguracja będzie dostępna i uruchomimy ją sobie tutaj.
Z tego robaczka możemy sobie też ten debugger zatrzymać później.
No to zauważ, że wszystko działa nam poprawnie.
Debugger zatrzymany.
Mamy tylko tą naszą początkową otwartą przeglądarkę.
Natomiast musimy się tylko i wyłącznie upewnić, że nasz serwer działa i możemy
sobie podłączyć konfigurację Debug.
Narzędzia JetBrains działają tak, że jeżeli te konfiguracje mamy ustawione
tutaj, to one z nami zostają, więc nie musimy tego konfigurować ponownie.
Tylko w tym projekcie będziesz miał dostępną tą konfigurację debug.