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.
Wiemy już, że styl naszej aplikacji zawdzięczamy Bulmie i zaimportowaliśmy
sobie ją tutaj jako Bulma CSS.
Możemy zaimportować sobie dowolny plik CSS.
Tak było z CSS.
To co było w App JSX tutaj w JS był zaimportowany właśnie
app, CSS i index CSS.
Mogą być to w takim wypadku też pliki lokalne.
Ponieważ nie korzystamy z żadnego z tych plików, możemy je po prostu usunąć.
I teraz przejdźmy sobie do rozważań, jak działają style właśnie w takiej aplikacji,
którą budujemy sobie z banderami.
Chociażby możemy tutaj zauważyć H Trójkę jako list of people.
I spróbujmy zrobić sobie jeszcze raz taki właśnie heading poziomu trzeciego, tylko
tutaj już w komponencie header, czyli zamiast P użyję sobie tutaj H3.
Zmieniam.
Zobacz ten cały subtitle z background white.
Załóżmy, że mamy taki cel, że to background white chcemy sobie przenieść
właśnie tutaj z tego stylowania do background white, który będzie
użyte właśnie poprzez CSS.
Czyli zabieram sobie ten background white stąd.
No i myślę sobie naiwnie, że jeżeli utworzę sobie przy komponencie plik
stylesheet i nazwę go tak samo, czyli header, no to tutaj będę mógł
sobie zrobić coś takiego jak H3.
I chciałbym określić, że tylko header właśnie w tej trójce będzie miał coś
takiego jak background color white.
Oczywiście ta zmiana jeszcze nic nam nie zmienia, dlatego, że to że mamy header JSx
i header CSS nie oznacza, że ten header CSS jest w ogóle wykorzystywany.
Pamiętaj o tym, że należy go zaimportować.
Czyli wszystkie elementy, które nie są importowane przez nas
to po prostu zombiaki.
Nie ma ich w kodzie, nie ma ich poprzez import.
Bundler nie wie, że powinien je zebrać.
No i widzimy charakterystyczną sprawę.
To znaczy ten styl, który mamy tutaj, wylewa nam się i tak naprawdę jest
zastosowany zarówno do tej trójki tutaj, jak i tutaj.
W tym miejscu List of people.
Mamy właśnie tego typu sytuacje, w których ten sam styl jest stosowany na całej
stronie, czyli nie jest to hermetycznie zamknięte.
Samo nazwanie tego header CSS, tak samo jak komponent nic nam nie daje.
W takim układzie importujemy sobie coś, ale ten styl, który
tutaj chcemy zastosować.
On stosowany jest we wszystkich trójkach.
Moglibyśmy sobie to jakoś rozgraniczyć i wpisać sobie tutaj na przykład BGWhite i
to BGWhite zastosować tylko tutaj, w tym miejscu.
No ale nie zmienia to faktu, że gdybyśmy mieli inaczej nazwane klasy CSS, one
byłyby podobnie nazwane i stosowalibyśmy je w jeszcze innych plikach CSS, to po
prostu dopisywalibyśmy tak naprawdę do nich.
Czyli kaskadowali te style, które już są zdefiniowane.
Zamiast tego chcielibyśmy hermetycznie zamknąć ten styl, żeby był on dostępny
tylko i wyłącznie dla tego właśnie headera tutaj.
Czyli ten header będzie miał własne definicje styli i to subtitle
powinno mieć BG White.
Okazuje się, że Wit obsługuje konwencję, która nazywa się CSS modules,
czyli tutaj CSS modules.
Jeśli wpiszemy sobie w wyszukiwarkę i tutaj guide na PC, zobaczymy, że jeżeli
nazwiemy coś jako moduł CSS, to wtedy możemy sobie zaimportować
klasy właśnie z takiego modułu i użyć je w taki bardzo przystępny sposób.
Czyli te klasy będą w ten sposób zastosowane do obiektów JavaScriptowych,
tak jak tu widzisz wyclassName.
My oczywiście mamy React, ale mamy className y, więc te className, które będą
tutaj dorzucane jako właśnie klasa, którą możemy sobie zastosować w zupełności
wystarcza w takim układzie.
Spróbujmy sobie zdefiniować ten moduł.
Będzie się to sprowadzało do zmiany tego naszego header CSS, czyli Shift F6 tutaj
albo po prostu klikając prawym refactor rename i dodamy sobie
tutaj właśnie moduł CSS.
W tym układzie import powinien nam się poprawić, Natomiast jeszcze nie jest to do
końca poprawnie, dlatego, że jeśli chcemy sobie to zaimportować i użyć BGWhite teraz
nam zniknęło, musimy sobie to zaimportować właśnie jako Classics.
No i tutaj From Modul.
Co zrobić, żeby złożyć sobie całe zestawienie tych klas?
Zauważ, że to jest po prostu wartość typu string, więc jeśli zrobimy sobie
konkatenację właśnie w taki sposób, że tutaj przestawimy to i będziemy w jakiś
sposób składać sobie ten nasz classes BGwhite, czyli po prostu
dodamy sobie ten string.
Zwróć uwagę, że tutaj musimy mieć spację, musimy mieć odstęp, bo
to będzie kolejna klasa.
Zobaczysz jak to dokładnie działa.
Jeżeli klikniemy teraz na Zbadaj.
My tak naprawdę nie dostajemy klasy BGWhite, tylko BGWhite z
różnymi tutaj szlaczkami.
W ten sposób właśnie działa definiowanie czegoś w module CSS.
Nie będzie to tak naprawdę ta nazwa BGWhite, co sprawia, że jeżeli
gdziekolwiek użyjesz BGWhite to to po prostu nie zadziała.
Czyli gdybyśmy tutaj w HeroBuddy użyli BGWhite?
Widzisz, że to nie działa.
Jeżeli użyjemy tego w Section. Tak samo.
Czyli generalnie nie ma czegoś takiego jak klasa BGWhite.
Bo ta klasa BGWhite zmieniła nazwę na swoją dedykowaną nazwę, z której będziemy
korzystać w przypadku zaimportowania właśnie tych klas do konkretnego pliku.
Więc tak, możemy to sobie hermetyzować.
Poznaliśmy już sposób, jakim będziemy sobie modyfikować style.
Czyli ten styl zawsze będzie obiektem, tak jak mamy tutaj.
Natomiast warto sobie dorzucić jakąś obsługę tych klas, żebyśmy dużo, dużo
łatwiej mogli sobie je składać właśnie w ten sposób.
Służy do tego package class Names.
Na npm js.
com możemy sobie wyszukać coś takiego jak class Names.
I to jest bardzo sprytna biblioteka, która pozwala nam na podstawie zdefiniowanych
przez nas klas po prostu nam je złączyć.
Możemy tutaj też conditional zastosować, czyli jeżeli spełniony jest jakiś
warunek, to wtedy className doda nam coś.
I na takiej zasadzie.
Taka prosta biblioteka jest nam w stanie pomóc, tak, żebyśmy sobie
elegancko przygotowali listę klas.
Spróbujmy zainstalować Class Names do naszego projektu.
I od razu mogę Ci pokazać miejsce, w którym będziemy mogli tego użyć.
To znaczy tutaj warto by było wrócić do naszego komponentu App i tutaj przygotować
sobie dobrze ten panel block, tak żebyśmy mogli sobie to klasę i tutaj poprawić
właśnie w oparciu o tą bibliotekę.
Spróbujmy ją sobie zainstalować, to będzie NPM install class names.
I teraz będziemy w stanie złożyć sobie to za pomocą class Names.
Spróbujmy użyć to zgodnie z tą dokumentacją, którą mamy tutaj.
Nie używamy składni require, więc my potrzebujemy class Names zaimportować.
Mamy tutaj importClassName from class Names i możemy to class Names zastosować
sobie właśnie w taki sposób dalej będziemy potrzebowali tego, żeby były tutaj nawiasy
cząsteczkowe, dlatego, że chcemy po prostu złożyć coś, dać wynik
działania jakiejś funkcji.
Zauważ, cały czas to działa poprawnie i tutaj dla tej jednej klasy nie
wygląda to zbyt specjalnie.
Co prawda ułatwiliśmy sobie sprawę, bo nie musimy pamiętać o tej dodatkowej spacji,
która ma rozdzielać klasy i to robi za nas class names, ale tutaj jakoś specjalnie
nie błyszczy w tym przykładzie dlatego, że jak gdyby musieliśmy się nawet troszeczkę
więcej napisać, żeby to dopisać w ten sposób fajnie by było, gdybyśmy
rozważyli sobie właśnie taki conditional.
Czyli zwróćmy uwagę, że tutaj ten blok jest if else.
Gdybyśmy chcieli sobie to uprościć i zrefaktoryzować właśnie w oparciu o klas
name, które by było tutaj, to można sobie założyć, że tutaj klasy, które będą
komponowane, to będzie zawsze blok, tak?
Czyli tutaj sobie na przykład to dodamy, ale możemy sobie właśnie klas names
zastosować, żeby dopisać te dodatkowe klasy, ale tylko i wyłącznie, jeżeli
jest selected jest zaznaczony.
Jak by to wyglądało?
Przede wszystkim importujemy sobie clasnames właśnie stąd.
Czyli tutaj będzie import class names from class Names.
I tutaj zobacz, że zamiast robić to w ten sposób, możemy sobie przeprawić
i zrefaktoryzować całość.
Czyli to class, które tutaj jest będzie class Names.
Zawsze będziemy mieli panel block, ale uwaga będzie pewien obiekt reprezentujący
pole, które tylko będzie dodane, czyli to, co jest tutaj w tym polu, tylko jeśli
selected będzie miało wartość true.
Mamy tutaj Isactive, mamy tutaj nasze class.
W takim układzie chcemy sobie to dopisać tutaj jako ClassName.
Zobacz, że class możemy dopisać tutaj.
Co więcej, to nam się upraszcza dlatego, że className class moglibyśmy
zrobić w ten sposób.
Co więcej, możemy teraz ClassName przerzucić sobie tutaj,
a tutaj zrobić conditional rendering, który sugerowałem Ci na samym początku,
czyli żebyśmy nie mieli if else Możemy tutaj sobie jeszcze to zrefaktoryzować,
czyli będziemy mieli class Names, które jest dopisane tutaj.
Jeżeli ta wartość będzie na true.
Tego totalnie nie potrzebujemy, ale tutaj będziemy mieli tego pana.
Ale uwaga tylko i wyłącznie jeżeli selected ma wartość true.
I w tym oto prostym układzie możemy sobie zrefaktoryzować ten nasz komponent i on
będzie właśnie przyjmował taką wartość.
Czyli mamy tutaj klas name, które będą dopięte tylko jeżeli jest selected.
Tutaj będziemy mieli name i tutaj jest selected i zaznaczenie.
Sposób działania class Names możesz kojarzyć z innych
frameworków JavaScriptowych.
Jeśli kojarzysz takie narzędzia jak View czy Angular.
One mają właśnie w ten sposób computowane klasy.
Niestety React nie ma tego out of the box dlatego, że nie przychodzi z takimi
rzeczami, ale właśnie takie pomocnicze biblioteki, które możemy instalować z npm,
a takie jak właśnie Class Names pomagają nam w tym, żeby taką funkcjonalność dodać.