od Podstaw
4 godz. 55 min · ReactJS · Full-stack i Programowanie
Adam RomanskiFrontend developer & YouTube CreatorWszystkie tresci podzielilem na piec rozdzialów, w których bedziemy rozwijac wymyslona przeze mnie aplikacje sluzaca do kolekcjonowania najciekawszych artykulów, notatek oraz kont twitterowych znalezionych w sieci.
Zaczniemy od prostych widoków, na podstawie których wyjasnie Ci, co stoi u podstaw Reacta – dowiesz sie czym jest JSX, oraz poznasz pojecie komponentu funkcyjnego. Dzieki temu oswoisz sie ze skladnia Reacta, która poczatkowo moze wydawac sie nieco obca.
W React niemal wszystko opiera sie o komponenty. Czym one sa? Dowiesz sie tego w drugim rozdziale. Opowiem Ci jak je tworzyc oraz jak tworzyc relacje miedzy nimi. Wyjasnie Ci bardzo szczególowo jak dzialaja propsy oraz w jakich sytuacjach nalezy je wykorzystywac. Zobaczysz tez, jak w Reactcie pracujemy z danymi, jak mozemy je przetwarzac a nastepnie stosujac kilka strategii stylowania komponentów, wszystko wyswietlic w atrakcyjny sposób.
W trzecim rozdziale poznasz sposób konstruowania komponentów klasowych, posiadajacych wlasny stan, dzieki któremu stworzysz miedzy innymi dynamiczny, inteligentny formularz, a takze wiele innych interaktywnych elementów. Dzieki temu szybko zrozumiesz róznice miedzy komponentami funkcyjnymi a klasowymi.
Kiedy juz poczujesz sie dosc pewnie budujac komponenty, dodamy tzw. routing w rozdziale czwartym, który pozwoli nam na stworzenie wielu podstron, które urozmaica nasza aplikacje – dowiesz sie dzieki temu jak integrowac dodatkowe narzedzie w naszym projekcie, oraz jak budowac bardziej skomplikowana strukture aplikacji.
Na sam koniec zostaimy sobie tzw. state managment, czyli zarzadzanie informacjami wspóldzielonymi przez wiele komponentów i podstron. Nie wykorzystamy jednak ani Reduxa ani Mobxa, poniewaz chce Ci pokazac, ze w samym Reactcie kryje sie ogromny potencjal nawet przy tak kompleksowych zadaniach. W tym przypadku uzyjemy Context API, który w latwy sposób pozwala nam teleportowac dane z jednego miejsca naszej aplikacji do drugiego. Podczas rozbudowywania naszej aplikacji o Context API dopracujemy tez wszystkie inne jej elementy, aby na samym koncu kursu wydeployowac nasz gotowy produkt w serwisie Netlify – zobaczysz, ze wypuszczenie aplikacji Reactowej do sieci i udostepnienie jej innym, jest niezwykle proste.W tym kursie skupiamy sie wylacznie na Reactcie z uzyciem jedynie niezbednych narzedzi. Wierze, ze doskonale opanowanie fundamentów, na których opiera sie ta technologia pozwoli Ci pózniej latwiej wkroczyc w swiat setek pluginów i paczek dostepnych w jego ekoystemie.
Ten kurs powstal z mysla o osobach chcacych zaczac swoja przygode z frameworkami JavaSript. Zaklada on wiedze na temat podstaw JavaScript (w tym ES6), jednak przy bardziej skomplikowanych rozwiazaniach zawsze pojawia sie slowo wyjasnienia. \n\nPoziom kursu zostal dopasowany do osób, które maja za soba juz kilka projektów w czystym JavaScript i chca wejsc na wyzszy poziom, przygotowujac sie tym samym do pracy z ta technologia.
Cześć! W tej lekcji kontynuujemy nasz wielki plan. I tym razem musimy
dopasować form.js do nowych potrzeb. Jakie to są nowe potrzeby? Popatrz,
stara funkcja addItem zawierała taką logikę. Pod
kluczem name zapisywaliśmy pierwszy element z tablicy, a właściwie jego wartość. Pod
twitterLink zapisywaliśmy drugi element, później trzeci i czwarty. Jak
sobie spojrzymy na nasz formularz, to w przypadku Twitter'ów, faktycznie tak to działało. Mieliśmy
pierwszy, to było imię, drugi to był link. Trzeci obrazek i czwarty,
to był opis. Dopóki mieliśmy tego typu konstrukcję, nie
musieliśmy tutaj nic zmieniać i mogliśmy polegać na takiej, powiedzmy, imperatywnej
logice. Natomiast w momencie, kiedy sprawy zaczęły się nieco komplikować i zaczęliśmy
zmieniać sobie kształt naszego formularza, w zależności od typu notatki,
które dodajemy w naszej aplikacji, to kolejność tych pól również się zmienia. Bo
teraz, na przykład, pierwszym polem jest tytuł. Drugim polem jest link,
ale trzecim polem nie jest obrazek, tak jak w przypadku Twittera, tylko od razu description. Więc
to, co chcemy zrobić, to zmienić logikę naszego form'a. Wykorzystać już fakt,
że on jest klasą i zawiera w sobie state, więc możemy tym state'em łatwo
manipulować. Możemy tutaj stworzyć, tak zwane, controlled components, o których
mówiłem w pierwszych częściach tego kursu, czyli taki rodzaj
input'u, który wpływa na to, co znajduje się w state'cie. A state wpływa na
to, co znajduje się w input'cie. Dzięki temu, będzie mieć pełną nad tym, co wpisujemy
naszym form'ie, w którym miejscu to znajduje, pod jakim kluczem to jest w naszym state'cie. A
ostatecznie, po naciśnięciu submit, będziemy wysyłać cały
taki obiekt z gotową notatką i już później będziemy się tym zajmować dalej
w naszym root'owym widoku. Brzmi ciekawie? Zaczynamy. Pierwsze,
co zrobimy, to zmodyfikujemy sobie trochę nasz stan. Sprawdźmy, jakie mamy rodzaje
notatek. Jakie mamy pola w formularzu. Powiedzmy,
że takim uniwersalnym polem dla name, będzie title,
ponieważ w dwóch przypadkach właśnie jest to title, a w
jednym name. Dla każdego pola stworzymy sobie taką pustą
wartość. Mamy title, link, image
i description. I te pola chcemy modyfikować,
poprzez nasze input'y, które mamy w tym miejscu. Żeby to
zrobić, musimy delikatnie zmodyfikować nasz input. W przypadku
komponentu radio, pokazałem ci jedną z możliwości, czyli przekazywanie
funkcji, którą następnie wewnątrz radio, przypisujemy
do onChange. Jest to droga trochę taka na około, bo można
to zrobić jeszcze prościej i właśnie ten drugi sposób pokażę Ci
tutaj, na przykładzie inputów. Weźmiemy sobie każdy input, który mamy. Wpiszemy
tutaj onChange. Nazwiemy sobie to handleInputChange. Stylowaniem
kodu się nie martwimy, bo zrobimy sobie autoformatowanie. Okej, już jest
dobrze. Teraz musimy stworzyć tę metodę, bo jeszcze jej nie mamy. Do
niej będziemy przekazywać event. Zaraz pokażę Ci dlaczego. Na razie po prostu zrobimy
console.log(e.target.name)
i żeby to zadziałało, to
musimy zrobić jeszcze jedną bardzo ważną rzecz. Pewnie już się domyślasz jaką, na
tym etapie kursu, jest to prawie, że oczywiste. Musimy wejść do naszego input'u,
ponieważ jest on custom'owym komponentem i nie
ma przekazanego props'a onChange, więc żeby on
zaczął działać, to musimy go tutaj przekazać. Możemy go przekazać, po prostu,
w ten sposób lub możemy wykorzystać props'y
z użyciem spread operator'a i wtedy to są props'y, które
przekazaliśmy, oprócz tego, co zadeklarowaliśmy tutaj po imieniu, czyli
na przykład, onChange, onClick i wszelkiego rodzaju event'y, które mogą
się gdzieś tam pojawić w aplikacji, których nie wymieniliśmy tutaj bezpośrednio. One
wszystkie zostaną zachowane w tym miejscu, w tym props. Jak
teraz podamy to w ten sposób, to one zostaną przypisane
tego tagu, tutaj. Ten tag jest dynamiczny. Pamiętaj, on się będzie nazywał
albo textarea albo input, w zależności od tego, jakiego props'a podaliśmy
tutaj, w tym miejscu. Nieźle nam się skomplikował
ten komponent. Wygląda całkiem imponująca, ale
teraz chwila prawdy. Sprawdźmy, czy nasze komponenty
działają poprawnie. Mamy, super. Mamy
wszystko tak trzeba. Jedną
rzecz tutaj zmienimy - name zmienimy na title i to wynika
to faktu, że będziemy się za chwilkę odnosić, po tych nazwach,
które mamy w props'ie name, do kluczy w naszym state'cie. Więc
musi być identyczne, musi być title, link, image i description. Sprawdźmy, czy reszta
się zgadza - title, link, image, description. Wszystko
jest okej, więc teraz możemy napisać naszą funkcję, która
będzie modyfikować stan i posłużymy się tutaj takim całkiem
sprytnym rozwiązaniem, bo zobacz, że mamy tutaj pewien problem. Mamy
jedną funkcję, jedną metodę, którą podajemy do czterech różnych input'ów. Czterech input'ów,
które mają zmieniać cztery różne wartości naszego state'u.Jak moglibyśmy
to zrobić, bez tworzenia czterech różnych metod, czyli na przykład handeNameChange, handleLinkChange
i tak dalej, bo przecież jak spojrzysz sobie tutaj, no to w tym
setState to jest banalnie. Ustawiamy tylko jedną wartość naszego state'u, a tutaj
chcemy, przy okazji, jednej metody zmienić cztery wartości w
zależności od tego, które pole wypełniamy w naszym formularzu. I kluczem
do tego, dosłownie kluczem jest tutaj to, bo
target.name - to są właśnie te wartości, w
tym miejscu, title, link i tak dalej. I one
z racji, że mają takie same nazwy, jak nasze klucze w state'cie, mogą
zostać wykorzystane właśnie jako taki dynamiczny klucz funkcji
setState. Jak sobie
napiszemy tę funkcję, to wystarczy, że wrzucimy to w nawiasy kwadratowe,
a w tym miejscu stworzymy
value, czyli będziemy podawać wartość
input'a do dynamicznego klucza, który jest taką
samą nazwą, jak na przykład title, jeśli wpisujemy title. Taką
samą nazwą, jeśli wpisujemy image i to się automatycznie wtedy będzie
uzupełniało. Popatrz - cztery linijki kodu, który
zaoszczędziły nam jakichś if'ów, jakichś dodatkowych metod,
które musielibyśmy pisać. Bardzo fajne są takie rozwiązanie w JavaScript'cie. Zawsze
doceniam, jeśli ktoś tak pisze kotkod, który jest po prostu bardzo krótki i bardzo czytelny.
Zresztą podobne rozwiązanie mieliśmy już tutaj w przypadku tego dynamicznego klucza
do descriptions. Tutaj też odwoływaliśmy się poprzez dynamiczne klucz
types, do odpowiednich wartości w naszym const'cie descriptions. Ale,
jeśli dobrze pamiętasz, dobrze działało controlled components, to pewnie pamiętasz,
że do naszych inputów musimy podać jeszcze jedną wartość, bo funkcja to
jest jedno, ale wtedy już nie input mówi
jakie ma value, tylko to state mówi input'owi, jakie value ma
mieć, po wykonaniu tej metody - handluInputChange, czyli tworzymy taką
zamkniętą pętlę, wtedy ten input jest kontrolowany przez nas, a nie
my go słuchamy. Więc teraz pod naszą funkcją
onChange, event'em, właściwie nie funkcją. Piszemy
sobie value, this.state i teraz
po kolei. Tutaj title, tutaj link, image
i description. I tutaj
mamy kolejny przykład na to, że podaliśmy nowego props'a, ale racji, że nasz input już
sobie destrukturyzuje te rest props, które pozostały, które nie wymienialiśmy
po imieniu w naszym komponencie i dodaliśmy właśnie tutaj value, które jest
nową wartością, którego nie destryktuzowaliśmy w naszym input. Nie
ma go tutaj nigdzie, ale jest ten props i on dzięki temu, że ma ten props, to
już będzie wiedział, że to value jest kolejnym props'em, podanym do tego komponentu. Żeby
się upewnić, że to działa, zrobimy sobie coś takiego. Piszemy
tutaj console.log'a i zrobimy taki
troszkę dłuższy console.log. Ja tutaj trochę przyspieszę. Okej, teraz
będziemy logować wszystkie klucze i będziemy widzieć na żywo, w czasie
rzeczywistym, jak one się zmieniają, więc teraz chwila prawdy. Title
działa, link działa, image działa
i description działa. Więc mamy wszystko gotowe. Nasz
formularz działa jak trzeba i możemy przystąpić do dalszego rozwoju naszej aplikacji.