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.
Na razie wyjmijmy to.
What will be renderred?
Jeśli chcesz zrobić komentarz w JSX, musisz użyć do tego takiego zapisu.
Czyli generalnie robimy sobie cząsteczki.
I teraz wykomentujemy What will be render?
Niech to zostanie dla potrzeby naszej edukacyjnej, żeby sobie
ewentualnie to wrzucić.
Natomiast nie potrzebujemy tego w projekcie.
Tutaj możesz poradzić sobie z tym problemem, bo jeśli End będzie narzekał,
że mamy coś, czego nie używamy w kodzie.
Co jest bardzo pożądane, mamy tutaj to w problems chociażby.
What will be render is defined, but never used.
Czyli widzimy, że mamy jakieś problemy i zgłaszającym problem jest klient.
Widzimy to tutaj po lewej stronie.
W takim wypadku mamy takie rozwiązanie.
Na przykład nie chcemy, żeby zgłaszał nam ten błąd dla konkretnej linii.
Więc tutaj możemy sobie to zakomentować w ten sposób.
Sline disable nextline none used false.
Jest to ciekawa opcja, jeżeli po prostu nie chcemy, żeby to było teraz zgłaszane,
bo celowo chcemy na razie pożegnać ten komponent i skupić się na tak zwanym
przekazywaniu danych poprzez proces.
Pokażę Ci ciekawy problem.
Otóż gdybyśmy chcieli teraz header powtórzyć kilka razy, czyli chcielibyśmy,
żeby ten header był tutaj powtórzony, to zawsze będzie to ten sam header.
Zawsze tak samo.
Mamy faktycznie kilka komponentów, dokładnie pięć i te pięć komponentów
zawsze będzie miało ten sam tytuł i podtytuł.
No i dzieje się tak dlatego, że za hardkodowaliśmy sobie te wartości,
które mamy w środku headera.
Gdybyśmy jednak chcieli zrobić to troszeczkę inaczej, możemy
skorzystać z tak zwanych propsów.
Co by było, gdybyśmy zdefiniowali sobie teraz, że ten komponent tutaj header
będzie otrzymywał coś takiego jak props i możemy to sobie zapisać od razu, a tutaj
nawet skonsulogować props, żeby zobaczyć pewną rzecz.
Otóż pomimo tego, że tego props jeszcze tak naprawdę nie widzimy, to zawsze
jest to dostępne jako obiekt.
Zobacz, Każdy komponent reaktowy dostanie coś takiego jak props.
Każdy będzie miał chociażby pusty obiekt, w którym props można nazwać
jako taki konfigurator.
Gdybyśmy teraz wymyślili sobie propsy takie jak np.
Title i wrzucili sobie tutaj Secret giver, zróbmy sobie dla odmiany secret GG, tak
żebyśmy zobaczyli jakąkolwiek zmianę tutaj, to możemy ten tytuł wykorzystać.
To pokazuje nam się tutaj dwa razy, dlatego, że komponent będzie wywoływany
dwukrotnie, czyli jego inicjalizacja tutaj w headerze będzie wywołana dwukrotnie.
Będę wyjaśniał to zjawisko, ale jest ono powiązane z React Strict modem.
Gdyby ten Strict Mod po prostu sobie wyrzucić, zostawić tutaj samo UB,
zauważysz, że wtedy nie mamy tego dwukrotnie.
Jednak ten strict mode będzie troszeczkę nam przeszkadzał aktualnie, czyli będzie
podwajał nam rzeczy, które robimy podczas developmentu.
Natomiast nie ma on kompletnie wpływu na produkcyjne rozwiązanie.
Natomiast jest bardzo istotne z perspektywy wyłapywania pewnych
błędów charakterystycznych dla Reacta.
Dlatego już teraz tłumaczę, dlaczego mamy konsologa dwukrotnie.
To będzie troszeczkę dla nas uciążliwe, ale skoro wiemy, jak to działa,
spodziewasz się, że ten header, który tutaj ma te propsy powinien
być wyświetlany jednorazowo?
Nawet jeżeli będziemy mieli jeden komponent, to po zainicjowaniu
będziemy to mieli dwukrotnie.
Wracając do naszych propsów możemy teraz zrobić coś takiego jak props title, żeby
wyrysować sobie właśnie ten nasz tytuł, który przekazujemy, czyli SecretGG.
Czyli zauważ, że w ten sposób jesteśmy w stanie konfigurować te nasze propsy,
które przekazujemy tutaj w headerze.
Tutaj będzie nam zgłaszał problem odnośnie Validation Props.
Tutaj z kolei zastosujemy sobie akcje, żeby to nam się nie wyświetlało.
Możemy to zrobić dla Disable, dla Next Line.
Możemy też zrobić disable dla całego pliku.
Moglibyśmy sobie przestawić troszeczkę ten komentarz.
To jest linka i tutaj s disable react prop types te prop types.
One będą dla nas dość istotne.
Będziemy chcieli, żeby te types nam się walidowały.
Natomiast później doinstalujemy sobie specjalne narzędzie, które będzie się
nazywało prop types i wtedy będziemy mogli z niego korzystać, więc
wrócimy sobie do tej walidacji.
Żeby to nam zadziałało, potrzebujemy jeszcze takiego rodzaju komentarza, czyli
musimy sobie to opakować w ten sposób.
Tak działa end, jeżeli chcemy zablokować coś dla całego pliku.
Więc tutaj mamy no answers dla what will be render, natomiast disable
react prop types dla wszystkich prop types.
Tutaj w tym komponencie z React Prop types wrócimy sobie później tak żeby sobie
doinstalować odpowiedni package i walidować te types, bo w ten sposób
będziemy chcieli działać w projekcie.
Natomiast teraz zobaczmy sobie jak te propsy działają, czyli mamy title.
Moglibyśmy też mieć subtitle.
I można to zdefiniować w ten sposób.
Ten subtitle to będzie exchange.
Gifts your collas.
Niech to tak będzie.
I teraz wrzucamy to sobie analogicznie, czyli mamy props i mamy
tutaj subtitle w ten sposób.
Zwróć uwagę, że propsy.
Definiujemy sobie camelCase.
Jeżeli by były wielowyrazowe.
Natomiast jeżeli zrobimy sobie jeszcze jeden header.
To widzimy pewien problem.
Bo teraz jak gdyby.
Ani title ani subtitle nie są zdefiniowane, mają wartości undefined.
Ale my już wiemy, że te undefined nie będą renderowane dlatego, że undefined po
prostu nie jest renderowany w JSX.
To udowodniliśmy sobie tutaj w tym miejscu.
W takim układzie co zrobić, żeby mieć default values?
Cóż, moglibyśmy sobie spróbować wyłuskać te propsy stosując nowoczesny zapis
JavaScriptu, czyli restrukturyzacje.
Jeżeli byśmy sobie zrobili restrukturyzacje i tutaj wrzucili to
title, to zauważ, że moglibyśmy domyślny tytuł dać i domyślny subtitle, czyli
moglibyśmy to zrobić w ten sposób.
I tutaj wrzucamy sobie subtitle.
W tym układzie mamy już dostępne title i mamy dostępne subtitle.
I teraz mamy wartości domyślne, czyli mamy header i mamy subtitle.
Można to zapisać lepiej w takim układzie.
Jeżeli chcielibyśmy uprościć sobie ten zapis, to możemy zauważyć, że te propsy,
które zawsze tu są przekazywane, zawsze masz pewność, że zawsze props
będzie tutaj i będzie obiektem.
Możemy restrukturyzować od razu, czyli zamiast zapisywać to w ten sposób,
przenieśmy to wszystko i zdestrukturyzujmy od razu jako parametr.
Od razu ten parametr może być zrestrukturyzowany i to będzie
najprzyjemniejszy sposób pisania komponentu.
Czyli te propsy, które przekazujemy, będziemy przekazywać właśnie w ten sposób.
I teraz w Reactcie nie będziemy mieli żadnych eventów.
Jedynym sposobem, jak można się komunikować na zewnątrz, czyli
jak ten header może coś przesłać.
Tutaj wyżej do AP będzie callback.
Czyli gdybyśmy chcieli skomunikować się tymi procesami w jedną stronę,
to już widzimy jak to zrobić.
Czyli po prostu załóżmy aplikacja definiuje tytuł i to jest nasz Secret Gift
Giver i ten tytuł możemy sobie przekazać tutaj właśnie za pomocą tych propsów
i tutaj w tytule zrobimy to w ten sposób.
I widzimy Secret Gift Giwera i mamy tutaj Exchange gift with your collex.
W takim wypadku nasz header jest gotowy.
Mamy też defaultowe wartości tych naszych właśnie elementów, które sobie tutaj
destrukturyzujemy natychmiast w tym miejscu i w ten sposób możemy
sobie przekazywać to do komponentu.
Gdybyśmy chcieli komunikować się w drugą stronę, musielibyśmy przesłać jakiś
callback, który zdefiniowany byłby tutaj na przykład.
Możemy to zrobić za pomocą const i tutaj zdefiniujemy sobie jakąś Arrowfunction
i możemy to show alert przesłać sobie tutaj np.
On alert.
Zdefiniujmy sobie i tutaj będzie show alert.
On alert może przyjąć wartość domyślną, która będzie po prostu pustą funkcją.
I w tym momencie, jeżeli mielibyśmy tytuł, w którym zrobimy onclick, to możemy tak
naprawdę zamiast onClick wywołać on alert.
Czyli można to sobie zapisać tak albo w uproszczeniu po prostu przekazać on alert.
I jeżeli teraz kliknę na tytuł, zobaczę alert hello, który jest zdefiniowany
tutaj, więc tutaj, tak jak widzisz, możemy się komunikować w drugą stronę.
Używając właśnie callbacka, możemy wywołać coś, co jest po tej stronie.
Gdybyśmy chcieli przekazać jakąś wartość on alert, czyli to nasze hello zależałoby
od wartości, która jest zdefiniowana tutaj w headerze, to możemy
przekazać sobie tutaj argument.
Natomiast zwróć uwagę, że będzie to parametr message w tej właśnie funkcji.
Więc tutaj mamy alert message.
I tutaj będzie hello from header.
Jeżeli klikniemy, dostaniemy Hello from header.
Tak więc wygląda komunikacja w dwie strony.
Parent to child.
Child to parent.
Parent to child.
To jest relacja, To znaczy relacja app do header.
Zwróć uwagę, że ta relacja następuje dopiero jeżeli w app osadzimy header.
Wtedy to jest parent, to jest child.
Komunikacja z parent do Child wygląda następująco, że możemy przesłać dowolne
wartości właśnie za pomocą propsów.
Nie ma ograniczenia co do typu tych wartości.
Zobacz, bo nie są to wartości renderowane przez JSX.
Są to wartości, które mamy tutaj niczym.
Funkcja ma swoje parametry i przesyłane ma argumenty.
Tak, tutaj mamy komponent, który ma swoje propsy, odbiera je sobie tutaj z góry.
Można powiedzieć, że tutaj przesyłamy jak gdyby argumenty, a tutaj
parametry odbieramy.
Czyli sparametryzowanie tego naszego komponentu jest możliwe.