w Praktyce
6 godz. 51 min · ReactJS · Full-stack i Programowanie
Adam RomanskiFrontend developer & YouTube CreatorNarzędzia typu ESlint, Prettier, Husky czy lint-staged niezmiernie pomagają nam w pracy. Problem jednak polega na tym, że ich konfiguracja bywa kłopotliwa. W tym kursie dowiesz się, jak poprawnie skonfigurować te narzędzia, tak, aby nie wchodziły ze sobą w konflikty i pomagały nam pisać lepszy kod.
Brzmi jak zły pomysł? Wcale nie! CSS in JS to rewolucyjne podejście, które pozwala nam tworzyć style bezpośrednio w komponentach. Dzięki bibliotece Styled Components możesz wpływać na ich stan, wygląd i wiele innych rzeczy. To niezwykłe narzędzie, wprowadzające powiew świeżości dla ludzi zmęczonych czystym CSS.
Dokumentowanie wyglądu i zachowania naszych komponentów bywa kłopotliwe. Jeśli jednak użyjemy odpowiednich narzędzi, staje się banalne! Storybook w połączeniu z podejściem atomic design pozwoli nam na stworzenie świetnie udokumentowanych komponentów.
React w Praktyce nie byłby... praktyczny, gdyby nie pokazanie tego, w jaki sposób rozwiązuje się problemy z layoutem aplikacji. Sidebary, szablony, powtarzalne komponenty – to wszystko poznasz w tym kursie.
Tworzenie store, czyli warstwy z danymi w naszej aplikacji dla wielu bywa wyzwaniem dość trudnym. Wynika to często z tego, że przykłady Reduxa bywają niepraktyczne. W tym kursie dowiesz się, w jaki sposób działa Redux – zaczniemy od podstaw, a skończymy na rozbudowanej strukturze danych. Dzięki temu zobaczysz, że nie taki Redux straszny jak go malują.
Aplikacja frontendowa bez backendu może istnieć, choć jej możliwości będą zdecydowanie ograniczone. A już na pewno będzie ona miała kiepską pamięć. Dlatego w tym kursie stworzymy lokalną wersję backendu połączoną z MongoDB na mLab. W ten sposób będziemy mogli dłużej przechowywać dane zapisane w naszych komponentach.
O testach można mówić wiele. To niezwykle rozległy temat, dlatego zanim zaczniesz je pisać na poważnie, chcę Ci pokazać jak możesz poćwiczyć podstawowe rzeczy. Poznasz narzędzie JEST, które odpowiada za uruchamianie testów, oraz wprowadzę Cię do react-testing-library, jednej z najpopularniejszych bibliotek do testowania aplikacji reactowych.
Ten kurs przeznaczony jest dla osób, które lada dzień będą aplikować na stanowiska juniorskie jako React developer. Zawarłem w nim wiele aspektów pracy z React, które zdarzają się w prawdziwej pracy. Ponadto skorzystać mogą z niego osoby, które znają inny framework JS i chcą nauczyć się Reacta, jednak kursy od podstaw są dla nich zbyt proste.
16.8.x
Cześć, w ostatniej lekcji stworzyliśmy sobie logikę, która pozwala nam na tworzenie
props'a podawanego. Cześć,
w ostatniej lekcji stworzyliśmy sobie logikę, która pozwala nam na tworzenie state
w zależności od tego w jakim root'ie się znajdujemy. Cześć,
w ostatniej lekcji stworzyliśmy sobie logikę, która pozwala nam na zmianę naszego state'u na
podstawie ścieżki, na której obecnie się znajdujemy i dzięki temu, że ta
ścieżka zawiera taką samą nazwę jak nasz props, który podawaliśmy w kilkunastu
miejscach w naszej aplikacji, czyli Page Type albo Card Type
twitters, articles, notes to były takie trzy typy, które zawsze gdzieś podawaliśmy. To
teraz możemy zrobić sobie z tego takie Single Source of Truth, czyli takie jedyne
źródło prawdy i opleść to w context, który następnie podamy
do naszej aplikacji i teraz, żeby przypomnieć
sobie jak to działało to conext stworzymy sobie w osobnym pliku, tak żebyśmy
mogli go importować i eksportować, więc może stwórzmy sobie po prostu w
SRC folder context, w którym
zrobimy sobie index js i to w nim
zaimportujemy sobie React'a, a następnie
stworzymy page context i stworzymy context,
w którym podany jako domyślny props, jako domyślny context
właściwie notes. Niech to będzie taki domyślny context,
który zawsze będzie podawany w razie gdyby nic tam w nim jeszcze nie było. Wyeksportujemy
sobie to, zaimportujemy go sobie do naszego main
template, a, on musi się nazywać page context,
wielką literą, ponieważ on będzie w JSX'ie jako komponent
podany i teraz
otworzymy sobie tutaj page context provider. Jako value
podamy mu this state page type, tylko
sobie to zdestrukturyzujemy tutaj, page type this state.
Okej, możemy to podać w tym miejscu
i w tym momencie, jeśli dobrze to podaliśmy to w jakimkolwiek
miejscu w naszej aplikacji, jeśli nie dostaniemy się do tego context'u
to będziemy mogli właśnie podejrzeć sobie co tutaj się w nim znajduje i na
podstawie tego context'u tworzyć nasze komponenty, ale
w poprzedniej lekcji pojawiła się taka metoda jak with router, którą
chciałbym ci nieco szerzej opowiedzieć, a właściwie opowiedzieć o kontekście
w którym ona została użyta. Ponieważ ona wykorzystuje
taki pattern, który nazywa się High Order Components. Jest to po prostu funkcja,
która zwraca komponent, ta funkcja wzbogaca w jakiś sposób komponent,
który eksportujemy tutaj, więc jeśli oplatamy
sobie main template with router, to ten with router wzbogaca nasz main template
o takie rzeczy jak na przykład właśnie location path name i
oczywiście
to jest taki gotowy Higher Order Component, ale możemy napisać właśnie swój
i teraz to zrobimy. Dlaczego to zrobimy? Już tłumaczę. Bo na
przykład, jeśli jesteśmy sobie tutaj, na
przykład jeśli wejdziemy sobie do naszego, bo
na przykład jeśli wejdziemy sobie na naszego grid template i mamy
tutaj page type, to nawet jeśli pozbędziemy się go z tego miejsca czy
nie będziemy go podawać jako props, a chcielibyśmy go wyciągnąć
z naszego context'u, to musielibyśmy tutaj zaimportować
context, stworzyć page context w taki sposób, otworzyć
jak ja to mówię portal do naszego context'u,
w taki sposób, podając context i dopiero zwracając cały nasz JSX,
który zawiera, który zawarty był w tym componencie
i jeśli to miałoby się zdarzyć tylko w jednym componencie to to nie
byłby problem. Problem polega na tym, że musielibyśmy tak napisać kilkanaście
komponentów albo przynajmniej kilka w naszej aplikacji i byłoby to bardzo uciążliwe
i ten kod by się powtarzał i zamiast powtarzać ten kod możemy po prostu
stworzyć taki provider, który po dodaniu
w tym miejscu pozwoli na dostęp do tego props'a, po prostu
bez pisania dodatkowego kodu w naszym JSX'ie. To wygląda trochę jak magia, ale
jest naprawdę fajne i też ten przykład który teraz Ci podam, wydaje mi się, że po
prostu fajnie tłumaczy na czym polegają Higher Order Components, bo nie ukrywam,
że ja na przykład zawsze miałem problem z tym żeby to zrozumieć z tego właśnie względu,
że te przykłady zazwyczaj były takie dość skomplikowane, a zaczynanie
od prostych przykładów jest moją mocną stroną, więc teraz pokażę
ci jak to zrobić. W naszym folderze SRC stwórzmy
sobie folder hots, jak Higher Order
Components i w nim stworzymy sobie plik with context
js i
zaraz
zobaczysz, że taki Higher Order Component nie różni się specjalnie od
takiego zwykłego React'owego komponentu. Różnica jest tylko taka,
że podobnie jak na przykład Higher Order Functions w JavaScript'ie, komponenty
te zwracają komponenty, więc mamy jakby komponent w komponencie, funkcję
w funkcji. Zaraz pokażę ci jak to wygląda, zaimportujemy sobie React'a, zaimportujemy
sobie nasz context, jak
zwykle zrobiłem błąd page context i teraz
tworzymy tai Higher Order Component, w taki sposób, że tworzymy sobie const'a with
context, with jest tutaj taką nazwą, konwencja nazewniczą,
można powiedzieć i każdy Higer Order Component właśnie zaczyna się od with, z małej
litery, więc to jest funkcja, która przyjmuje komponent i ta
funkcja z racji, że ten komponent jeszcze przyjmuje jakieś props'y, które
po wywołaniu też właśnie trzeba mu podać, ta funkcja musi zwrócić nam
kolejną funkcję i tutaj użyjemy
sobie starej składni. Nazwiemy to context component
i w
nim podamy props'y, które ten komponent będzie jeszcze zawierał i w
jaki sposób możemy zwrócić sobie w końcu nasz JSX
w takiej postaci, że mamy tutaj page context consumer. Odpalamy
sobie wrota naszego kontekstu, podajemy kontekst w taki sposób. Podajemy nasz
komponent, podajemy
mu wszystkie props'y jakie on tylko tam dostaje, żeby one nie zginęły i dodatkowo
podajemy kontekst jako
osobny props i teraz jeśli wszystko dobrze zrobiłem i wejdę
sobie na przykład do grid template, zaimportuje sobie with context i opakuje
mój grid template, mój nowo utworzony Higher Order Component, a
dodatkowo zdestrukturyzuje sobie kontekst jako
nowy props, którym mu podałem, to
już widzę, że popełniłem błąd, bo nie wyeksportowałem sobie mojego Higher Order Component,
Export Default with context. Teraz
powinno działać, okej. Wejdźmy sobie do naszych
dev tools'ów. Znajdźmy
grid template i jak
widzisz cpntext został podany, mamy tutaj notes. Jeśli
wejdę sobie do twitters, to context zawiera twitters,
więc nasz context działa, nasz Higher Order Component działa. Teraz
jedyne co musimy zrobić to zrefakturować resztę naszej aplikacji, tak
żeby nasz kontekst mógł podawać właśnie ten page type,
ten props page type do naszych
komponentów. A to zrobimy na szybko w następnej lekcji.