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.
Musimy powiedzieć sobie o zasadach i regułach używania huków, dlatego, że do
tej pory szliśmy sobie taką wesołą ścieżką.
Nigdy nie spotkaliśmy po prostu jakiegoś przypadku, w którym źle
byśmy użyli danego huka.
Chodzi mi tutaj o deklarację.
Być może ten efekt nie działał tak jakbyśmy chcieli, ale generalnie
uzupełniając dependencies i wartości West End wszystko było w porządku.
Natomiast huki nie były od zawsze w Reakcie.
I tutaj należy Ci się trochę kontekstu historycznego.
Dawniej, żeby używać stan, musielibyśmy mieć tak zwany komponent
klasowy i ten komponent klasowy.
On był w stanie obsługiwać stan jako jedyny.
Dlatego gdybyśmy chcieli aktualizować stan, wtedy używało się czegoś takiego
jak set state jako dissed state.
No i stan definiowany był w ten sposób.
Zwróć jednak uwagę, że w tej nowoczesnej dokumentacji i w nowoczesnym Reactie
rekomendacja jest taka, żeby użyć funkcji.
I tutaj see how to migrate będzie dla Ciebie materiałem, który powinien Ci
pozwolić na migrowanie, jeśli byłaby taka konieczność jakichś starszych projektów,
właśnie napisanych we wcześniejszej wersji Reacta właśnie sukcesywnie
do komponentów funkcyjnych.
Jednak Hooki mają swój zestaw reguł i ten zestaw reguł zobacz jest bardzo
ładnie opisany tutaj Rules of hooks.
Można to sobie znaleźć właśnie w dokumentacji Rule of Hooks.
No i tutaj mamy zawsze top level i zawsze w komponencie funkcyjnym.
Czyli musimy mieć body of the function component albo top level
in the body of custom hook.
Czyli możesz sobie zrobić własny custom hooki na podstawie istniejących.
I to jest bardzo ciekawe, dlatego, że to pozwala nam po prostu wydzielić logikę
naszego komponentu i zrobić sobie właśnie takie kompozycyjne podejście
do logiki komponentów.
Czyli kilka komponentów może wykorzystywać tą samą logikę.
Moglibyśmy sobie zauważyć, że tutaj gdybyśmy zapakowali sobie to set
selected names i w ogóle people.
Możemy sobie zdefiniować własnego hooka i use people i te wszystkie elementy
spakować razem, tak żeby zrobić sobie własnego customowego hooka.
To jednak jest temat na późniejsze rozważanie po tym szkoleniu.
Tak, żeby sobie zrobić własne huki i spróbować sobie tego
kompozycyjnego podejścia.
Natomiast zobaczmy sobie, jakie są reguły do tego, żeby używać huków.
Jak musimy do tego podejść.
Przede wszystkim nie możesz mieć hooka, który ma jakąś conditional logic, czyli w
zależności od tego, jaki jest warunek, wywołuje się warunkowo.
My tutaj mamy akurat taki szczęśliwy przypadek, że gdybyśmy sobie wyobrazili,
że tutaj byłby If i zrobilibyśmy sobie jakiś warunek, czyli celowo tutaj wrzucę
coś, co będzie po prostu na ten przykład nie do końca poprawne.
Chodzi nam tylko o to, żeby zobaczyć jakiś konkretny warunek.
No to widzimy, że to kompletnie nie ma sensu z perspektywy samego kodu samego
JavaScriptu, dlatego, że nie mamy dostępu po prostu do SetSelected names dlatego, że
If ma zasięg w tym wypadku leksykalny tutaj i ten zasięg leksykalny tego
constant, który tutaj jest, spowoduje, że on nie wyleje nam na zewnątrz tego
ifa, czyli nie mamy do tego dostępu.
Jednak możemy sobie wyobrazić, że chcielibyśmy zobaczyć coś takiego, że
selectujemy na przykład Johna tylko i wyłącznie, jeżeli coś
więcej jest za selectowane.
Czyli na przykład jeżeli selected names length jest większy od 1, to wtedy za
selectuj Johna, czyli jeżeli jest przynajmniej 1, weźmy to sobie większe od
0, czyli będziemy mieli przynajmniej 1 albo więcej.
Jeżeli jest select to wtedy tylko wtedy select id Johna.
Zauważ, że nie możemy tego zrobić dlatego, że tutaj dostajemy informację od Clinta
React use effect is could conditional.
Czyli od razu dostajesz informację zwrotną od Clinta.
W takim układzie jak doczytasz dalej w tej dokumentacji my używamy dokładnie
tego sline plugin React Hooks.
On jest skonfigurowany out of the box.
Właśnie w tym foldzie wita.
I mamy tutaj taką rekomendację, żeby go używać.
Natomiast mamy go już skonfigurowanego w naszym projekcie, więc możemy to zrobić.
Zobacz, nie da się tego zrobić striczem.
Nie możemy tego zrobić w momencie, gdy mamy tutaj classComponent, bo on nie używa
hooków i używamy sobie tutaj jednego hooka w drugim.
Czyli jak gdyby zamiast zrobić to na zewnątrz, zamiast zdefiniować te wszystkie
hooka na zewnątrz, w środku jednego hooka mamy inny.
Zauważ, że jest pewna konwencja nazywania tych hooków jako use.
Czyli mamy use state.
Mamy coś takiego jak use context.
I nawet tutaj w przypadku naszego custom hooka on się nazywa use window built, więc
mamy tutaj konwencję nazewniczą właśnie z takim use, żeby poprzedzać
każdego hooka nazwą use.
Czyli mamy tutaj jeszcze takie dobre praktyki w pisaniu huków w nazywaniu huków
i w poszukiwaniu ich w innych bibliotekach, bo zauważysz, że dużo
różnych bibliotek korzysta z huków, czyli dostarcza właśnie takiej logiki
zewnętrznej, która może być współdzielona poprzez inne komponenty.
Gdybyśmy chcieli faktycznie tak zrobić, że jeżeli set Selected Names Land jest
większy od zera, to wtedy i tylko wtedy chcemy selectować Johna.
Musimy przenieść ten warunek tutaj.
Ale wtedy mamy do czynienia z tym, że znowu musimy się pilnować.
I to set selected names, który tutaj sobie wymyśliłem, będzie moim
dependency, który mam w środku.
Czyli generalnie mamy coś takiego, że to set selected names, które mamy tu
weźmy sobie to poprawmy będzie miało ten sam błąd, który mieliśmy wcześniej.
Żeby to zrobić poprawnie, musiałbym skorzystać tutaj z body tej funkcji.
Czyli docelowo chciałbym to sobie zrobić na tej zasadzie, że jeżeli set selected
names faktycznie jest większe, tak?
No to wtedy zwracam to.
fajnie by było sobie to wtedy opakować.
A jeśli nie, to zwracam SN, ponieważ nie chcę zmieniać
stanu i wtedy sprawdzam sobie SN, a nie selected names.
Zauważ, że jakby zawsze mamy jakiś sposób do tego, żeby sobie to w ten sposób ograć.
Co więcej, moglibyśmy sobie to uprościć, zastosować tu Turner i operator, że jeżeli
length jest większe od zera, to wtedy zwracamy taką tablicę razem z
Johnem, a jeśli nie, to zwracamy SN.
I teraz możemy sprawdzić, czy nasz kod działa poprawnie.
Teraz, jeśli otworzymy sobie aplikację, zauważymy, że John nie jest selektowany.
Musielibyśmy się w ciągu tych dwóch sekund wyrobić, żeby zaznaczyć chociażby jedną
osobę i wtedy John zostanie delegowany.
Czyli odświeżam, wyrabiam się.
W ciągu tych dwóch sekund zaznaczam kogoś i zobacz, że John jest zaznaczony.
Pamiętaj, że ten efekt w ciągu tych dwóch sekund wywoła się tylko jednorazowo.
Dlatego właśnie musimy to zrobić w ten sposób.
Tutaj jeszcze o jedne nawiasy cząsteczkowe za dużo.
Możemy to sobie tak właśnie uprościć.
Mamy set selected names z wszystkimi elementami.
Tak by to wyglądało.
Więc jeżeli masz właśnie takie przypadki, że chcesz uruchomić conditional logic albo
jakąś pętlę albo try catch, to musisz jak gdyby skorzystać z ciała tego hooka i tam
w środku na przykład jakiegoś callbacku, z którego ten hook korzysta,
ustalić swoją conditional logic.
Czyli te reguły warunkowe przenosimy do środka.
Nie można jak gdyby warunkowo wywoływać hooków.
Kontrakt jest taki, że za każdym razem people page musi być tak zwanym pure
function, czyli jak gdyby nie dość, że musi dla tych samych danych wejściowych
zwracać te same dane wyjściowe, to jeszcze dodatkowo mamy taką regułę, że wszystkie
huki muszą w takiej samej kolejności i tą samą ilość razy się wywołać, która jest
spodziewana, która została tutaj zadeklarowane.