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ść! Zanim zaczniemy wprowadzać jakieś nowe funkcje i
możliwości do naszej aplikacji, to musimy zerknąć jeszcze na jedną rzecz. Nasz kod
w niektórych miejscach wygląda po prostu tragicznie. Jednym najgorszych elementów
tej aplikacji niewątpliwie jest form.js, gdzie mamy właściwie cztery
takie same elementy pod rząd, gdzie zmieniają się tylko jakieś detale i spokojnie
mógłby być to osobny jeden komponent, nazwany po prostu input
i tak właśnie zrobimy. Wywalimy te cztery elementy te cztery div'y
odpowiadające za nasze cztery inputy w tym miejscu i
stworzymy z tego jeden komponent, który będzie przyjmował odpowiednie props'y.
Więc otwórzmy sobie nasz Explorer i odpalmy folder
Components. To w nim stworzymy zaraz nowy folder
o nazwie input, a w nim input.js Od
razu, przy okazji, stworzymy input.module.scss. Teraz
wyjmiemy sobie naszego div'a z tego miejsca. On
się kończy tutaj. W kleimy
go do naszego input'a. Wyeksportujemy.
Oczywiście musimy zaimportować Reacta i Style. Okej i
teraz spójrzmy jakie elementy naszego komponentu muszą być
dynamiczne. Przede wszystkim dynamiczny musi być ten tag, ponieważ czasami to
będzie input, a czasami to będzie textarea, ale w przeciwieństwie do tego jak zrobiliśmy
to w poprzedniej lekcji, gdzie tworzyliśmy nowego consta. Tutaj możemy po prostu zrobić props'a,
który jeśli się pojawi to input będzie textarea, a jeśli
się nie pojawi to będzie to po prostu input. Jak tam możemy zrobić? Otóż
już tłumaczę. Przede wszystkim zdestrukturyzujmy sobie nasze props'y. Pierwszym
z nich będzie tag. Drugim będzie name. Później
id. możemy też dodać maxLength i teraz jak
zobaczymy, to w sumie ta nazwa powtarza się w trzech miejscach, więc
możemy po prostu zrobić jako name i będziemy
wiedzieć, że użyjemy ją w trzech różnych tagach. Ten placeholder
usunąć. On nie będzie nam jednak potrzebny i możemy
dodać jeszcze label. Zobaczymy
czy to nam wystarczy. Teraz musimy pobrać PropTypes i
stworzymy sobie propTypes
dla naszego komponentu. Tagiem zajmiemy się za chwilę. PropTypes.String.isRequired.
Podobnie będzie w przypadku label
i maxLenght. To
będzie nie string, tylko number. Okej i
teraz naszym tagiem będzie również string, ale
on nie będzie wymagany, ponieważ tutaj zrobimy sobie defaultProps. Tag i
jeśli nie będzie podanego tag'a w props'ach,
to chcemy, żeby to było input. Dodatkowo
w tym miejscu, ponieważ jeśli zmieniamy
nazwę komponentu na nie generyczną nieHTML'ową, to musi
być ona napisana wielką literą, a props'a podanego jaką małą
literę, ale możemy zrobić coś takiego i w tym
momencie nasz props powinien zadziałać. Zresztą
zaraz to przetestujemy. Okej, pierwszy props podmieniony, teraz
czas na następne. Type text i to się raczej nie zmieni. W
tym miejscu dajemy name. Podobnie jak tutaj i
tutaj. Zwróć
uwagę, bo wcześniej o tym nie mówiłem, że w label, w JSX'ie
musimy użyć takiego props'a - htmlFor. Wynika
to z tego, że for w javascripcie jest słowem zastrzeżonym dla pętli,
dlatego JSX musiał użyć jakiejś innej nazwy i tutaj stąd
ten htmlFor. Dzięki temu możemy używać właśnie tego label'a. Jeśli
użyliśmy zwykłego for'a to React od razu zasypał
by nad błędami w konsoli i w tym miejscu Jeszcze podmienimy
na label. Okej,
czas przetestować nasz komponent. Wrócimy sobie do naszego form'a. A jeszcze
jedna rzecz. Musimy skopiować wszystkie style dotyczące
tego input'a. Więc skopiujemy
sobie to. Powinno wystarczyć. Input,
teraz możemy usunąć wszystkie te okropne div'y i zastąpić
je naszym input'em. Jak
widzisz zaimportował się tutaj bezpośrednio. Visual Studio Code zrobił to za nas
i teraz pamiętając o props'ach, które musimy podać. Pierwsze
z nich to jest tag, ale jest tam domyślny i akurat tam będzie input'em, więc nie musimy
go podawać. Drugi to jest name i podamy mu po prostu
name. Później
mamy label i mieliśmy tam jeszcze maxLength. Właściwie maxLenght też
możemy zamienić. Nadać
na przykład długości 50 albo 40 znaków,
chociaż nie, zróbmy inaczej. Ponieważ mogą być też linki i
opisy, więc niech to będzie 200 znaków. Tylko
w miejscach gdzie będziemy celowo chcieli żeby było krótsze to nadamy wtedy inną
wartość i od razu widzę, że nie zmieniliśmy jeszcze tego props'a - maxLength,
Okej, teraz powinno wszystko działać. Wracamy
do formy. Pamiętaj, że
tutaj props maxLength musi być liczbą, więc musimy to podać w ten
sposób. Okej,
a teraz dodajemy pozostałe elementy i zobaczmy, czy wszystko jest
jak trzeba. Tutaj mieliśmy link. Nazwijmy
to Twitter link, żeby było bardziej jasno. Tu mamy image i zarówno
w Twitter link jak i w image usuniemy nasze maxLenght. Czwarte
było description i tutaj
chcemy użyć props'a tag, w którym nazwiemy
to textarea i zobaczymy czy to się zmieni. Tak,
jak widzimy nasz
komponent stał się tekxarea, więc ten dynamiczny props, który
stworzyliśmy w tym miejscu jak najbardziej działa.
Widzę jednak, że chyba trochę za bardzo się pospieszyłem usunięciem
tego placeholdera, bo jednak wtedy ta animacja nie działa. Wynika
to z tego, że to jest taki a'la Material Design Input, ale
z czystym CSS'ie i stąd ten mały hack, żeby to była tu po prostu spacja,
wtedy ten placeholder Idealnie działa, a w naszym kodzie właściwie
nic to nie zmienia. Właściwie w działaniu input'a. A skoro wygląda
lepiej, to czemu nie. Jeszcze dwie drobne rzeczy na koniec. Kopiując
nasze style do input'a ukradłem też button, który teraz wygląda tragicznie, więc
wrócimy go z powrotem w tym miejscu. Okej, a drugą
rzeczą jest to, że przez ten dynamiczne tag, teraz nasz
textarea nie łapie odpowiedniej klasy, ponieważ dostaje klasa input, a
powinien dostawać klasę textarea i po raz kolejny
możemy zaradzić temu po prostu stosując ternary operator, czyli
tym miejscu robimy tag. Jeśli
textarea, to styles.textarea,
a jeśli nie to input. Jeśli to jest niejasne, to
po prostu sprawdzamy czy tag, props tag, który podaliśmy wyżej
u rodzica jest identyczny ze string'iem textarea,a
nie może być inny, jeśli chcemy żeby to było akurat textarea i wtedy jeśli
to spełnia ten warunek to nadaje mam klasę textarea, a jeśli nie spełnia
tego warunku, czyli jest inne niż textarea to wtedy dostaje klasę input, a
każdy inny przypadek input'a w tym form'ie jest właśnie
niczym innym jakim inputem. Dlatego to zawsze będzie działać. Jeszcze jedna
taka mała kwestia do wyjaśnienia, bo to może być dość magiczne. Jeszcze wcześniej
tego nie tłumaczyłem. Przy destrukturyzacji możemy używać specjalnych znaków,
które coś tam sugerują, na przykład jeśli chcemy, żeby nazwa
props'a wewnątrz komponentu była użyta w inny sposób, czyli
na przykład była pisana wielką literą, mimo że jest podawana jako mała litera,
to wtedy możemy użyć dwukropka. Po prostu zmieniamy nazwę tego props'a.
On mógłby się tutaj nazywać na przykład kangur i to też by działało. A czemu
kangur? Nie wiem i wydaje mi się, że w tej lekcji to na tyle. Zauważ tylko
jak bardzo usprawniliśmy nasz komponent, jak bardzo upiększyliśmy
nasz kod, tak naprawdę redukując kilkadziesiąt linijek do kilkunastu, a
jedyne co zrobiliśmy to przenieśliśmy zawartość jednego div'a do osobnego
komponentu i trochę go pozmienialiśmy, żeby był bardziej dynamiczny, żeby nieco
sprytnie i przyjmował props'y i to wszystko i na tym właśnie polega piękno i
jak to, że możemy takie stosunkowo skomplikowane rzeczy robić w bardzo krótkim
czasie i w tak naprawdę bardzo prosty sposób. Przed nami jeszcze druga
część tej lekcji, ponieważ nie chcę tutaj przedłużać, a widzę jeszcze co najmniej dwa
komponenty, które można taki sam sposób wyekstraktować do
osobnego komponentu. Zanim przejdziesz do następnej lekcji, spróbuj w głowie odpowiedzieć,
które to mogą być komponenty. Do zobaczenia w następnej lekcji.