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.
W kolejnych lekcjach tego modułu powiemy sobie o operacjach asynchronicznych i
jak sobie z nimi radzić w środku Reacta.
Zależy mi na tym, żeby w List of People nie występował żaden problem.
Niestety z poprzednich lekcji mamy tutaj jedną rzecz.
Otóż tutaj występuje sytuacja, w której ten link będzie pod spodem.
Tak naprawdę ancorem więc mamy a w środku A i dlatego mamy ten problem.
Tutaj chciałbym, żeby to było czyściuteńkie i to List of people
nie zwracało żadnego błędu.
Dlatego poprawię to po prostu na diva.
Ten div spowoduje, że zabierze mi tą fajną funkcjonalność on hover.
Musielibyśmy sobie to ręcznie dostarczyć.
Natomiast nie będziemy mieli tutaj żadnych dodatkowych błędów.
Wszystko działa poprawnie.
Teraz przechodząc sobie do wyzwań, które przed nami stoją, to wyobraźmy sobie
sytuację, w której People jest do nas dostarczane, ale poprzez
funkcję get people.
Co więcej, nie ma już tego eksportu, czyli jakby nie jesteśmy w stanie tego
odebrać w ten sposób jeszcze więcej.
Chcemy sobie tutaj właśnie dorzucić to jako operację asynchroniczną,
czyli get people. To teraz promise.
Czyli to jest operacja asynchroniczna.
Co prawda to jest troszeczkę taka imitacja, dlatego że People to statyczna
tablica i wrzucamy ją w promises, ale to nam wystarczy, żeby zobaczyć pewien
problem, który byśmy mieli, bo możemy sobie wyobrazić, że to jest takie
zablokowanie właśnie odbierania danych z backendu.
Get People przychodzi do nas z backendu.
Teraz, jeżeli odświeży tą stronę już jest problem, dlatego, że importujemy gdzieś
people, a tego importu już nie ma.
Nie jest to eksportowane tutaj z tej strony.
Wróćmy sobie do Pages.
Tam gdzie mamy ten problem, czyli w People Pages, nie możemy już zrobić people,
tylko musimy zrobić get people.
Co za tym idzie, wszędzie tam, gdzie używamy people, będziemy mieli problem.
People is not defined dlatego, że wszędzie tam gdzie
people używamy, to tego już nie ma.
Podejdźmy sobie do tego naiwnie.
Skoro tam mogliśmy zrobić promise, to tutaj może jesteśmy w stanie to odebrać.
Czyli zrobilibyśmy sobie await i tutaj get people i to powinno wystarczyć, ale wiemy
z doświadczenia, że sync await idą w parze.
Czyli musimy dodać esencję tutaj do funkcji people page, żeby
await zadziałało w ten sposób.
No i okazuje się, że dostajemy kolejny error objects are not
valid as React child.
Dlaczego ta sama zasada, skoro tutaj async spowodowało, że Get people
nie jest już tablicą stringów?
Zauważ tylko teraz jest promise tablicy stringów.
No to w takim samym układzie.
Jeżeli tu dodamy async, to people page nie jest już komponentem.
Jest komponentem, który tak naprawdę jest opakowany w Promise, czyli jest Promise.
Z punktu widzenia JSX a to jest po prostu obiekt.
Więc JSX zwraca nam problem, że słuchaj, słuchaj, nie mogę osadzić people page.
Jak to mogę zrobić, skoro to jest obiekt?
Nie wiem, jak sobie z tym poradzić.
No i teraz widzimy, że nie jesteśmy w stanie tak przygotować komponentu.
Nie możemy mieć tutaj słowa kluczowego async, a jeśli tak, to
tutaj nie możemy mieć await.
W takim układzie możemy sobie poradzić troszeczkę inaczej.
Co by było, gdybyśmy użyli Effect?
Czyli nasz kolejny pomysł to będzie use effect.
Ale use effect musi się nam z czymś łączyć, dlatego że no okej, jest effect,
chcemy, żeby on wywołał się jednorazowo, więc tablica dependency as będzie pusta.
Chcielibyśmy, żeby to People nam się tutaj załadowało, ale równocześnie musimy
zaktualizować w jakiś sposób to, co komponent wyświetla.
Czyli komponent musi wiedzieć o tej zmianie, skoro ma wiedzieć o zmianie.
I mówimy w ogóle o zmianie, czyli że People na początku będzie pustą tablicą, a
później będziemy mieli jakąś wartość, to oznacza to ni mniej ni więcej, że
musimy użyć use state, czyli use state.
To będzie nasze people.
Teraz i tutaj będziemy mieli set people.
W tym momencie początkowa tablica jest pusta.
To powinno zacząć nam działać.
Oczywiście nie będzie nic wyświetlać i mamy people i set people I teraz
chcielibyśmy sobie to odebrać i zrobić set people w momencie gdy
odbierzemy tą promise.
Innymi słowy tutaj sobie spróbujmy zrobić async I tutaj
spróbujmy sobie zrobić const myData await getPeople i później zrobimy
sobie set people jako myData.
Pomimo tych błędów i tak widzimy, że coś tutaj jest nie tak.
Effect boards are synchronus to preventrace conditions put
the async function inside.
Czyli tutaj widzimy, że mamy takie coś, że nie możemy w efekcie
bezpośrednio dopiąć async.
Głównie tutaj mamy wyjaśnienie dlaczego tak jest.
Będziemy mieli też runtime owy exception tutaj i ten Runtime Overexception mówi
nam, że musimy mieć clean up function i to clean up function nie może być promise,
musi być zwykłą funkcją, więc jeżeli dopniemy sobie async to tutaj to clean
up, które byłoby zwracane na returnie.
To nie byłaby funkcja, tylko byłaby to promesa, która resolwuje do tej funkcji.
Nie chcemy tego i React tego nie chce, dlatego musimy tutaj poradzić
sobie troszeczkę inaczej.
Zróbmy to w ten sposób.
Możemy mieć funkcję fetchdata Albo tutaj wrzucić sobie to, co potrzebujemy
tutaj, a sync i natychmiast wywołać to feee.
Ok. Zobaczmy, że teraz wszystko działa.
He he he.
Jest o tyle niefortunną nazwą, że mamy coś takiego w Global Scope jak.
He he he. Warto to sobie troszeczkę inaczej nazwać.
He he he. Data na przykład.
A jeszcze lepiej, jeśli znasz koncepcję hi fi zrobić to jako imidity
invoke function expression. Co to oznacza?
Mamy funkcję, która natychmiast jest wywoływana.
To znaczy, że gdybyśmy wzięli to wszystko w nawias i zrobili sobie funkcję, czyli
zobacz, robię zwykły nawias i funkcję.
I teraz wyobraź sobie, że to reprezentuje jak gdyby tak zwane function
expression, czyli function expression.
To jest troszeczkę coś innego niż definicja funkcji, ale możesz sobie tak to
wyobrazić na potrzeby przykładu, że tutaj funkcja jest zdefiniowana tylko
i ja ją wywołuję w tym momencie.
I to jest hi fi.
To będzie jak gdyby ten kod, który mam tutaj, cokolwiek tutaj napisze,
natychmiast zostanie wywołane. Dlaczego?
Dlatego, że z perspektywy czysto technicznej dla interpretera nie ma
znaczenia, czy ty zrobisz identifier czegoś, czyli czy coś nazwiesz czy nie.
W tym przypadku mamy tutaj coś, co jest nienazwane, anonimowe arrowfunction
i natychmiast to wywołujemy.
Matematycznie jest to poprawnie napisane.
Musimy sobie tutaj jeszcze dorzucić tego asynca przed i teraz wrzucić tą całość.
Tutaj uprościć możemy też set people, bo z perspektywy interpretera również nie ma
znaczenia, czy Ty zrobisz sobie stałą pomocniczą czy nie.
Więc możemy to sobie wrzucić tutaj i odchudzić trochę.
Ten kodzik teraz będzie wesoły.
Zobacz mamy use effect, set people get people i wszystko działa tak jak powinno.
Rozwiązaniem więc naszej zagadki jak radzić sobie z operacjami
asynchronicznymi jest use effect.
Ale uwaga w środku i połączenie to ze stanem.
Dlatego, że coś co przychodzi do Ciebie w czasie no niestety zmienia się w
czasie albo stety i musimy mieć.
W takim wypadku stan use state jest konieczny, jeżeli czegoś nie ma.
A później chcemy na przykład zapytać o to backend i backend przyniesie nam te dane.
Czyli generalnie robimy tutaj zapytanie asynchroniczne, zapytanie Ajax.
Tutaj symulujemy oczywiście takiego Ajaxa.
Symulujemy set people.
Moglibyśmy sobie wyobrazić, że tutaj będzie to troszeczkę bardziej
skomplikowane, czyli będziemy chcieli sobie zrobić taki preloader,
tak jak mamy tutaj. Loading.
Data about mark.
I tutaj będzie jeszcze stan obsługiwany is loading albo is error.
Dlatego, że tutaj powinniśmy sobie to opakować triczem.
My wiemy, że tutaj nic złego się nie stanie, dlatego, że to jest nasza
symulacja i tam nie ma możliwości, że ta promisa, konkretnie Get people zwróci nam
coś innego niż people, że zwróci nam błąd.
Ale gdyby tak było tutaj, bylibyśmy w stanie obsłużyć ten błąd
w ten czy inny sposób.
Na razie obsłużymy to sobie po prostu pokazując ten błąd na konsoli.
Ale ten try catch dla każdej promisy, która faktycznie robiłaby wycieczkę do
backendu, powinniśmy tutaj umieścić.