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.
Dla urozmaicenia tego wyzwania, które przed nami stoi, dorzucę kod do robienia
exchange, czyli do momentu, w którym zaslektujemy sobie te dwie osoby i chcemy
dorzucić sobie tutaj make exchange, czyli chcemy, żeby to party nam wystartowało,
żebyśmy mieli imprezę i żebyśmy mieli pary, kto komu kupuje prezent.
Zauważ, że działa to w ten sposób, że przekazując sobie jakąś listę w momencie,
gdy to sobie uruchomię, ja tutaj skorzystam z Community Vision Quoki, żeby
natychmiast uruchomić ten plik dostanę pary.
Czyli dla danych 1 i 2 dwójka kupuje prezent jedynce, a jedynka dwójce.
Więc gdybyśmy tutaj wyobrazili sobie, że będziemy mieli Eve
i uruchommy walkę jako automatycznie, no to dla samej Ewy niestety nie będzie
par, dlatego, że mamy tylko jedną osobę.
I tutaj jest ta reguła, że jeżeli list of people jest mniejszy od
dwóch, to dostajemy puste.
Ale jeżeli będzie Ewa i np.
John no to wtedy dostajemy. John.
Ewa. Ewa.
John.
W zależności od tego, jak się nam wylosuje.
Czyli to powinno być losowe, Czyli różnie powinny się te pary losować.
Natomiast odczytujemy tą tablicę tablic w ten sposób, że Ewa kupuje prezent Johnowi.
John kupuje prezent Ewie.
Zabawa zacznie się oczywiście dopiero wtedy, kiedy będziemy mieli
więcej niż dwie osoby. Czyli tutaj mamy.
Ewa, Mark, John kupuje Ewie i Mark kupuje Johnowi.
Nie przejmuj się, jeśli niewiele rozumiesz z tego kodu, który tutaj jest.
Jest on tutaj tylko po to, żebyśmy przećwiczyli osadzanie właśnie takiego
zewnętrznego kodu w naszej aplikacji.
Jest on dostępny dla Ciebie w materiałach tej lekcji.
I właśnie tutaj Make Exchange powinniśmy wywołać na Exchange of Gifts.
W momencie, gdy dostaniemy tablicę zaznaczonych użytkowników,
nie jest to wariant produkcyjny.
Jeśli chcesz produkcyjnie pobawić się tym, proszę usiądź nad RandomizeArray.
Ja tutaj sobie pobawiłem się, żeby albo było shift albo pop, więc albo z lewej
albo z prawej strony zdejmuje z bazowej rajki losowo elementy.
Dużo lepiej by było po prostu wybierać losowe elementy z tablicy, żeby
układać tą randomize, którą mamy tutaj.
Analiza tego kodu dużo, dużo później.
Natomiast my chcemy teraz osadzić sobie ten kod, zobaczyć jak programistycznie
nawigować i mamy do tego doskonały powód.
To znaczy zauważ, że jeżeli tutaj na PeoplePage wybierzemy sobie ludzi, czyli
mamy to selected names, chcielibyśmy to jakoś przekazać do tej strony Exchange.
Chciałbym to zrobić za pomocą routingu.
Routing obsługuje coś takiego jak stan.
I to będzie bardzo ciekawa rzecz, ale mówimy tutaj o stanie nie naszego
komponentu, tylko o stanie history router, do którego mamy dostęp w momencie, gdy
nawigujemy programistycznie, więc jest to doskonały powód do tego, żeby
tutaj nawigować programistycznie.
Możemy sobie wyobrazić to w ten sposób, że w momencie, w którym zaslektujemy
użytkowników, to będziemy mieli tutaj odpowiedniego buttona.
I załóżmy, że ten button będzie nam pokazywał, że możemy wystartować nasze
przyjęcie, ale oczywiście musimy mieć odpowiednią ilość osób.
Czyli tutaj w Selected Names musimy mieć możliwość pokazania lens ile
osób zostało za selectowanych.
Mamy tutaj 0.
W momencie gdy zaczynam selectować mam 3 osoby.
John się selectuje, bo tutaj mamy ten kod, który selectuje go z automatu.
Czyli ten use effect.
Możemy zatrzymać na chwilę działanie tego kodu, żeby nam nie przeszkadzał, żeby ta
aplikacja nie zachowywała się tak nie deterministyczne.
Weźmy sobie, zaznaczmy po prostu ludzi.
Widzimy, że to działa, aczkolwiek ten button powinien nam się pokazać dopiero
wtedy, gdy spełniony jest warunek, że selected names lens jest większe od
jednego i wtedy chcemy wyświetlić sobie właśnie tego diva z batonem.
Czyli generalnie jeśli mamy tylko jedną osobę z selectowaną, to ten
button się nie pokazuje.
Ten button pokazuje się dopiero wtedy, gdy mamy więcej osób w tym układzie.
Tą część logiki mamy gotową.
Natomiast na start party chcemy zrobić onClick jako Handle navigation i
tutaj przygotujemy sobie funkcję.
Spróbujmy ją zrobić tutaj na górze.
Handle Navigation musi użyć specjalnego hooka, który nazywa się Use Navigate.
Możemy zapisać sobie to jako Navigate Use Navigate i zaimportować
z React router dom.
I teraz to nasze Navigate powinno odprowadzić nas do Exchange.
Jeśli zostawimy to tylko w ten sposób, to wtedy zaznaczając dwie osoby start party
będziemy widzieć, że faktycznie przechodzimy do Exchange.
Czyli wszystko działa programistycznie, ale nie jest to konkretny powód
do tego, żeby użyć Navigate.
Moglibyśmy tą samą funkcjonalność uzyskać, gdyby po prostu przesłać linka
jako klas name button i info.
Wyglądałby on wtedy tak samo i tutaj dalibyśmy tu i Exchange, ale tutaj mamy
jeszcze jedną rzecz, którą chcemy zrobić.
Chcemy wysłać statek, który będzie odebrany po stronie Exchange
to selected names.
Te name'y, które select owaliśmy chcemy sobie odebrać po stronie.
Exchange page.
Więc exchange page będzie musiał dobrać się do właśnie tego stanu.
Zobaczmy sobie jak to będzie wyglądało.
Wróćmy do Exchange Page i teraz tutaj będziemy chcieli odebrać stan.
Ten stan będzie przy Use location.
Czyli z kolei wybieramy Hook.
Use location i on będzie miał w sobie stan.
Jednak jeśli ten stan nie jest podany.
To wtedy będzie miał wartość null.
Więc to, że przyrównamy sobie to do pustej tablicy niezbyt wiele nam da.
Ale na razie możemy sobie to sprawdzić.
Wiemy, że ta tablica zostanie wyrenderowana dlatego, że jest
to po prostu tablica stringów.
Zobacz teraz nie została przekazana.
Musimy wrócić, powtórzyć sobie to samo.
I start the party i mamy Mark i Krysia.
Jeżeli odświeżymy nasz widok, to marki Krysia zostaje.
Ale uwaga jeżeli przejdziemy do People i z powrotem na Exchange, to gubimy ten
stan, więc ten stan jest ulotny.
To nie jest jak gdyby stuprocentowo bulletproof rozwiązanie.
To jest rozwiązanie, które polega na routerze, ale przekazujemy sobie te trzy
imiona z jednej ścieżki do drugiej, używając właśnie
programistycznej nawigacji.
W takim układzie Navigate odprowadza nas do Exchange i wysyła stan z tymi
Selected names, który chcemy przekazać.
Handle navigation, które mamy tutaj i które przekazujemy programistycznie w
momencie, gdy nas odprowadzi i przekaże stan Exchange Change musi teraz odebrać to
wszystko ze stanu i uruchomić naszą logikę.
Czyli make Exchange powinno zostać uruchomione.
Spróbujmy sobie to make Exchange uruchomić właśnie dla tego stanu.
I uwaga ten stan może być null.
Więc ja sobie tutaj zrobię OR i tak defensywnie wrzucę sobie
pustą tablicę w razie czego.
I tutaj dostajemy pary, które kupują sobie prezenty.
Możemy je sobie odpakować na przykład jako takiego boxa.
Czyli możemy sobie tutaj przygotować kawałek widoku jako box
i mapować po tych parach.
Zobacz, że jeżeli przemapujemy, to wiemy, że tutaj każda para ma
person i four person.
Załóżmy, że tak sobie to opakujemy, czyli robię restrukturyzację tej tablicy tablic.
I tutaj chciałbym sobie zastosować takiego boxa, który może być flexem
i tutaj Space Between.
Tutaj jeśli upakujemy to sobie w dwa takie właśnie spany, to możemy użyć
sobie klasy chociażby tak. I na przykład tak.
Is success. A tutaj dla tego person jest info.
I teraz, w momencie, gdy będziemy mieli ten stan, zobaczmy sobie people.
Zaznaczamy Start party.
Pamiętajmy o kluczach.
Person zawsze występuje jednorazowo, więc możemy tutaj jako klucza
użyć sobie person.
I tutaj jeżeli nie używam returna i mam to wpisane właśnie w ten sposób,
to powinienem usunąć te znaki.
Więc Mark by se gift for. Ewa.
Ewa. By gift for Mark.
Mamy dwie osoby.
Spróbujmy z trzema osobami. Mark.
Krysia. John.
Mark i Krysia. John.
Jeśli odświeżymy stronę, to oczywiście te pary mogą nam się losować
ponownie, ponownie. Ale uwaga!
Nie jest to produkcyjne rozwiązanie, dlatego, że to Make Exchange nie jest
powiązane z aktualizacją stanu w naszych Reactowych komponentach.
Akurat wykorzystujemy tutaj ciekawy fakt, że make Exchange zawsze będzie w momencie,
w którym się przeniesiemy na tą stronę, czyli Exchange of Gifts.
Natomiast gdybyśmy zaczynali od tej strony, czyli np.
Spróbujmy sobie zacząć tutaj.
No to nie mamy stanu początkowego.
Musimy wrócić do People, wybrać te trzy osoby i start the party.
Oczywiście możemy sprawdzić, czy pary w ogóle są.
Jeżeli ich nie ma, to możemy wrzucić odpowiednią informację.
Na przykład można sobie zrobić tutaj Computer property party started.
I to zawsze będzie.
Czy w parach będziemy mieli jakikolwiek wynik?
Czyli jeżeli będziemy mieli chociażby dwie pary.
No to wtedy możemy rozpoczynać.
I teraz, jeżeli pary nie jest wystartowane, to dajemy
odpowiedni komunikat.
Czyli mamy tutaj Please select people first.
Jeżeli zaczniemy teraz od Exchange albo przelatujemy na inną ścieżkę, wrócimy.
Please select people first.
I dopiero jeżeli sobie zrobimy start the party, to wtedy przesyłamy ten state.
Korzystamy z Use location i wtedy odczytujemy state, czyli to co
zostaje przesłane z selected names.
Zauważ, że możemy ze zwykłych selected namesów przejść sobie do obiektów.
Wtedy zarówno make Exchange będzie działać dlatego, że nie determinuje
czym jest list of people.
Możemy tu mieć dowolne obiekty.
Powinno nam się to elegancko zalosować.
Natomiast kosztowałoby to nas aktualizację naszego UI, dlatego, że wszędzie
odnosimy się po prostu do name'ów.
Nie są to obiekty, tylko są to po prostu stringi.
Niemniej nasza aplikacja.
Taki prototypowy wariant działa, Gdybyśmy chcieli puścić go na produkcję.
No to fajnie by było zrobić troszeczkę lepszy randomizer, do tego area.
No i oczywiście musielibyśmy sobie rozwiązać problem ze stanem danych,
dlatego, że teraz przekazujemy stan routerem.
Wszystko jest ok, ale w momencie, w którym wrócimy do People wrócimy na Exchange.
Please select people first.
Nasza aplikacja powinna działać troszeczkę inaczej, ale mamy taki problem, że tutaj
musimy mieć stan współdzielony pomiędzy PeoplePage, którą mamy
tutaj a Exchange page. Tak?
Czyli jak gdyby te dwie strony musiałyby mieć jakiś komponent bazowy, być może
komponent app, na którym mielibyśmy stan i ten stan zostałby rozlany
do tych komponentów.
Natomiast nie mamy już takiej wygodnej zależności pomiędzy app a pozostałymi
komponentami, żeby przekazać ten stan.
Na ten moment rozwiązujemy ten problem właśnie poprzez use location
i stan naszego routingu.