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ść, po tym jak skończyliśmy budować nasze atomy, a przynajmniej część
z tych atomów, to teraz możemy przejść do budowania molekuły. Pierwszą
taką molekułą, którą się zajmiemy jest na pewno komponent karty składający się
z tytułu, takiej informacji o tym kiedy został utworzony, opisie,
button'ie i takim wrapperze, także teraz przejdźmy
sobie na naszego edytora i zakończmy to. Na
początek odpalimy sobie storybook'a tak żebyśmy mieli już włączony
ten system i teraz w przeciwieństwie do tego jak wyglądały
nasze atomy, nasze molekuły już raczej nie będę składały się wyłącznie ze
styled-component, tak jak tutaj. Będą zawierały jakiś JSX. Przejdźmy
sobie zatem do folderu molekuł i stwórzmy naszą pierwszą molekułę. Nazwiemy ją
card. Nim oczywiście znajdziemy card js i
card stories js. Zaimportujemy
sobie React'a, styled-components, a także
komponenty paragraf, heading oraz
button. Okej, skoro wszystko już mamy zaimportowane to teraz możemy
stworzyć sobie nasz komponent, na początek może
być to zwykły komponent funkcyjny, zobaczymy jak nam to pójdzie i teraz ja
stosuję taką konwencję, że wszędzie gdzie mam styled-component,
który zawiera już jakiś JSX to i tak takim zewnętrznym komponentem
zawsze jest wrapper albo styled-wrapper, w którym właśnie
zdefiniujemy to, jak to wszystko ma wyglądać. Przede
wszystkim możemy sobie zerknąć na padding, mamy tutaj 30 i 17
i od tego sobie zaczniemy. Stworzymy
sobie ten styled wrapper tutaj w tym miejscu. Zaimportujemy heading, okej,
skoro nasz komponent już jest gotowy, to teraz możemy zaimportować sobie
stories i kiedy to już mamy gotowe to napiszmy
sobie story do naszego pierwszego komponentu. Musimy
jeszcze zaimportować nasz komponent oczywiście, okej. Podobnie
jak w przypadku poprzednich komponentów zrobimy
to w ten sposób, okej mamy tutaj błąd, że nie można zaimportować
komponentów, wynika to z tego, że gdybym chciał używać
tylko takich importów to wewnątrz mojego
folderu z komponentem musiałby się znajdować index js, a nie heading js.
Mogłoby to być wygodniejsze, natomiast jeśli już stosujemy indeksy,
to zazwyczaj robimy tak, że indeks jest osobnym plikiem, który importuje heading js
i eksportuje go, więc jest to takie dodatkowy koszt utrzymania
tych komponentów, a w tym przypadku możemy zrobić po prostu coś
takiego, że będziemy importować
je mimo wszystko dodając nazwy
tych komponentów dwa razy, czyli jeden jest
dla folderu, a drugi jest dla pliku o takiej samej nazwie, ale
nie jest to wielki problem, bardziej zaawansowani użytkownicy mogą
sobie napisać jakąś metodę, która to rezerwuję bez indeksu i bez
tego button'a na końcu. Natomiast nie będziemy się tym zajmować w tym kursie, to
jest taki naprawdę detal, sprawdźmy nasz card component.
Okej, jeśli zobaczymy sobie na to, co mamy już teraz,
a na to jak wygląda to na naszych design'ach to niewiele nam
trzeba. Pierwsze co musimy zrobić to musimy dodać ten żółty wrapper,
który jest na górze naszej karty. Dodatkowo jeszcze rzucimy
sobie cień pod naszym komponentem i teraz
jak zobaczymy sobie na to co już mamy i na to co mamy tutaj to pojawia
się kolejny problem, ponieważ ten padding tutaj rzuca nam
się tutaj na nasz wrapper drugi, czyli on jest zależny od tego
padding'u, a chcemy żeby on dobijał do krawędzi naszego komponentu, więc
wyrzucimy sobie ten padding stąd, dzięki temu nasz
górny wrapper będzie miał 100% w szerokości
naszego komponentu. Wrócimy go sobie w to miejsce już
widzimy, że ten dolny padding może być nieco mniejszy. Powiedzmy,
że to będzie 10 pikseli i teraz ten dolny wrapper
ma dokładnie ten sam padding, tylko nie jest żółty, więc
możemy zrobić coś innego. Nazwiemy to zamiast tag, nazwiemy to inner wrapper,
damy mu props'a yellow
i teraz jeśli yellow
będzie prawdziwe to my nie mamy theme primary, a
jeśli yellow jest nieprawdziwe, to damy tutaj po prostu white i
teraz tutaj w tym miejscu jak podam yellow to
mamy żółty, opleciemy
sobie drugą część naszego komponentu tym inner wrapperem,
okej. Jesteśmy prawie, prawie w domu. Jedyne
co nam zostało to zaokrąglone rogi, możemy
to uzyskać właśnie poprzez dodanie rodzicowi
border-radius i schowanie tych w tych ostrych rogów
poprzez overflow hidden, mimo wszystko ten 17
pikselowy padding na dole chyba może zostać. Będzie to okej i teraz
dodajmy sobie jeszcze tutaj informacje o dacie
utworzenia i to, co możemy zrobić ze styled-component,
który wygląda inaczej niż chcielibyśmy, żeby wyglądał w danym miejscu to możemy go po
prostu ostylować odpowiednio do danej potrzeby. Akurat w tym
komponencie możemy to zrobić w taki sposób. Podajemy
wtedy do styled w nawiasach komponent, który chcemy
rozszerzyć o jakiś styl. Dajemy
mu tutaj font-weight bold.
Tutaj zamiast paragraf
dajemy date, info i zrobiłem literówkę, dobra
i jeszcze tylko nam został font-size, który tutaj pewnie będzie
nieco mniejszy. Font też możemy wyciągnąć
sobie z naszego theme, w porządku
i teraz jedyne co nam jeszcze wadzi to marginesy w naszym heading'u,
które powodują że ten żółty prop jest
naprawdę wielki, więc możemy zrobić coś takiego jak styled header, styled heading i wiedząc,
że akurat w tym miejscu marginesy naszego heading'u
są za wielkie, możemy je po prostu wyzerować i podmienić
w tym miejscu komponent. Podobnie
zrobimy z date i info, ponieważ te dwie rzeczy w naszych design'ach przylegają
do siebie bardzo mocno. Teraz to co jeszcze możemy zrobić
to dodać na przykład trochę marginesu tutaj na dole i
tutaj na górze. Dobra,
skoro to już mamy zrobione to teraz tak, szerokością tego się nie przejmujemy, ponieważ
będziemy to wrzucać w grid'a, który będzie sam określał automatycznie szerokość
tego komponentu. Natomiast możemy nadać mu jakąś minimalną wysokość i tutaj w
naszych design'ach jest to 385 pikseli
przy czym te dwie rzeczy się od siebie odpychają, więc tutaj prawdopodobnie będziemy
musieli użyć flex'a, tutaj teraz zrobimy sobie min-height,
spróbujmy na razie 380 pikseli
w porządku. Teraz tutaj użyjmy
sobie flex'a, ale zróbmy może to w taki sposób tylko
ten dolny będzie flex'em. Zaimportujemy
sobie CSS, który już znamy z naszego styled-components
i zrobimy coś takiego. Jeśli flex
jest obecny to
zrób mi z tego komponent, który ma display: flex, flex-direction
column justify-content
space-between, uwaga. Okej,
to nam nie zadziałało z tego względu, że nasze rodzic
ma min-height, czyli nie ma do końca określonej wysokości. Tutaj
nawet jakbyśmy dali height to nic nam nie zmieni. Ten
komponent nadal zajmuje tylko taki wycinek, nie zajmuje
całego naszego komponentu, tak jak powinien, możemy
to rozwiązać z racji, że możemy korzystać z grid'a, to możemy
zrobić coś takiego, tutaj display grid grid-template-rows
i teraz tak, możemy w gridzie
używać jednostki fraction, która mówi nam, że na
przykład jak mamy dwa razy fraction to jest dwa razy po
pół. To są tego samego, to są tej
samej wielkości fragmenty, więc teraz jeśli zrobimy
zero dwadzieścia pięć i jeden to ten będzie mniejszy o trzy czwarte
od tego, czyli ten zyskał 75%
naszego komponentu, jeśli chodzi o wysokość, a więc dostał
tą wysokość, która była potrzebna do tego żeby flex tutaj zaczął
działać i te elementy zaczęły się od siebie odpychać, dlatego
zawsze podkreślam, że grid i flex box to są techniki
komplementarne względem siebie uzupełniające się, a nie konkurujące. Dlatego
strasznie nie lubię pytań typu co jest lepsze flex box czy grid, okej
i w tej lekcji to wszystko, w następnej lekcji zrobimy sobie kolejne
rzeczy, które są związane z tą kartą, ponieważ mamy jej aż trzy rodzaje w
naszym projekcie, mamy jeszcze takie ze zdjęciem i mamy takie z
linkiem.