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 poprzedniej lekcji udało nam się stworzyć nasz store, ale póki co
nasz react jeszcze nie wie o tym, że mamy cokolwiek wspólnego z redux'em
w tym projekcie. Wynika to z faktu, że jeszcze nie skorzystaliśmy z naszego pluginu,
który zainstalowaliśmy, czyli React Redux, więc teraz postaramy się go
zainstalować, żeby to zrobić musimy wykorzystać provider, który udostępnia
nam właśnie React Redux i opleść naszą aplikację w store,
który stworzyliśmy. Robimy to w taki sposób, że wchodzimy sobie do naszego root'owego
widoku i tutaj musimy zaimportować provider z biblioteki React Redux. Następnie
w tym miejscu, czyli jako najbardziej zewnętrzny element,
oplatamy naszą aplikację i żeby
to zaczęło działać musimy zaimportować jeszcze nasz store. Nasz store importujemy jako Export
Default, więc możemy po prostu zrobić coś takiego jak import store from store
z racji, że to jest plik index js, czyli nie musimy podawać
jego nazwy w taki sposób i skoro już ten store pobraliśmy
to jedyne co musimy zrobić to wpisać store i podać store,
który zaimportowaćliśmy w tym miejscu. Okej i jeśli poprawnie
to zrobiliśmy to teraz jeśli odpalimy sobie naszą aplikację, to ten
console log, który mamy tutaj w reducerze w tej chwili, powinien się pojawić
w naszym tutaj w naszej przeglądarce w konsoli i faktycznie mamy
tutaj nasz console log, póki co nie zwraca żadnej akcji, która
została podana, bo jeszcze żadnej akcji nie wykonaliśmy, więc skoro
udało nam się poprawnie podpiąć nasz relax do React'a, to
teraz możemy zacząć się nim trochę bawić. Przechodzimy więc do takiej
najbardziej ekscytującej moim zdaniem części budowania aplikacji, czyli tego
momentu kiedy interfejs łączy się z tym datalayer. Jest naprawdę fajne,
że te komponenty, które z takim trudem tworzyliśmy nagle ożywają
dzięki tym danym, które propagujemy po prostu w naszej aplikacji, więc
to co teraz musimy zrobić to połączyć sobie jeden z naszych widoków. Załóżmy
że będzie to twitters i wywalimy sobie to co mamy teraz
tutaj w twitters albo zróbmy inaczej. Skopiujemy
sobie te wszystkie dummy date'a, które tu mieliśmy. Po prostu całą
te tablicę, żeby
nie było tak, że jak wkleimy tutaj nasze twitter, to będzie tylko jeden ostatecznie. Niech
będzie ich kilka. Ten błąd przez chwilę się będzie nam tutaj wyświetlał i teraz
to, co chcemy zrobić to chcemy połączyć nasz widok twitters z naszym
redux'em tak, żeby on wiedział co właściwie my chcemy tutaj wrzucić, czyli to twitters,
żeby zaciągnąć z naszego store'a i żeby to zrobić będziemy musieli wykorzystać
dwie rzeczy. Jedna związana z redux'em. Jest to mapStateToProps,
jest to specjalna funkcja, która mapuje nam
właśnie nasz state, które mamy w storze do props'ów, który podajemy
do naszego komponentu. Drugą rzeczą jest Connect, który pozwala nam na
to, że łączymy ze sobą te dwa osobne światy,
czyli świat Redux'a i świat React'a, więc teraz spróbujmy sobie to zaimplementować
i pokażę ci na naszym przykładzie jak możemy sobie ten State stąd wyciągnąć. To
co musimy zaimportować to
Connect z React Redux. Musimy
teraz zadeklarować funkcję mapStateToProps, która
przyjmuje State i która następnie
zwraca nam obiekt z props'em, który zostanie podany do naszego
komponentu, czyli musimy tego props'a jakoś nazwać. Nazwijmy go na przykład twitters i
ten twitters będzie wyciągał sobie dane
z naszego state twitters, więc musimy stworzyć
sobie faktycznie const'a, w którym zdestrukturyzujemy twitters z naszego state'u
i teraz z racji, że mamy tutaj klucz i wartość o takiej samej
nazwie to możemy zastosować po prostu składnię ES6, która mówi,
że jeśli klucz i jej wartość ma taką samą nazwę, to możemy po prostu stworzyć coś takiego
i to jest temu równe, a skoro już jesteśmy przy takim ulepszaniu
naszego kodu, to możemy zrobić jeszcze jedną rzecz. Po prostu wyciągnąć sobie
z naszego store'a twitters i zwrócić twitters. Jeśli ES6
nie jest jeszcze taką twoją super mocną stroną to jeszcze raz wyjaśnię te składnie,
bo wygląda na dość enigmatycznie dla kogoś kto być może tak super dużo
nie korzystał z tej składni. Tutaj podajemy funkcję
strzałkową z której zdestrukturyzujemy sobie twitters, czyli
jeśli nasz state, czyli nasz obiekt state zawiera
klucz twitters, to możemy go sobie zdestrukturyzować wyciągając go
właśnie w tym miejscu. To pewnie już wiesz i następnie
w efekcie naszej funkcji zwracamy tutaj obiekt, który zawiera klucz twitters,
a ten klucz twitters zawiera wartość twitters, czyli
to co w tym miejscu sobie wyciągnęliśmy. Jeśli ta
nazwa byłaby inna, na przykład my twitters, to tutaj również
ten ta wartość byłaby my twitters i wtedy nie moglibyśmy
skrócić tego obiektu, natomiast z racji, że importujemy sobie destrukturyzujemy
sobie twitters z naszego store'a i ta
nazwa jest dokładnie taka sama jak nazwa props'a, który chcemy podać do naszego komponentu, to
możemy sobie to skrócić w taki
sposób. Mam nadzieję, że teraz jest to dla ciebie w stu procentach jasne
i to co musimy zrobić w tym momencie, to połączyć nasz
komponent twitters z naszym mapStateToPropsm żeby
to zrobić musimy użyć funkcji Connect w tym miejscu. Ona
przyjmuje z jednej strony nasz komponent, a z
drugiej strony mapStateToProps i w
tej chwili nasz komponent został połączony z naszą funkcją mapStateToProps, która zwraca nam w
props'ie nasze twitter'y. Wywalmy
sobie na sekundę to co mamy tutaj w tym miejscu i w naszym komponencie twitters
wyciągniemy sobie props'y i zróbmy z nich consol
log'a. Chcę ci pokazać co się wydarzyło w momencie
kiedy ta funkcja Connect została użyta. Musimy
wejść sobie do naszego widoku twitters. Okej,
coś tutaj poszło nie tak. Zaraz sobie zaczniemy to debugować. To
jest właśnie urok tego kursu, że wpadamy na różne pułapki i możemy sobie je
razem zweryfikować, co tam się dzieje. Spróbujmy
w taki sposób. Okej, już widzę jeden błąd. Nie
oplotłem tego console log'a w klamry, więc
jakim cudem on miał niby działać. Dobra, sprawdźmy teraz naszego console log'a
i widzimy, że
na trzynastej linijce, czyli tutaj niżej state
jest undefined, a tutaj w obiekcie mamy
co prawda twitters, czyli ten obiekt został podany do props'ów, ale
on również ma undefined, no bo podaliśmy tutaj nasz state, więc
coś z tym state'em jest nie tak i przejdźmy sobie może po kolei to
jak tworzy się nasz store, bo wydaje mi się, że może gdzieś zrobiłem jakiś
błąd w moim
storze, otworzę sobie
tutaj store, za pomocą tej funkcji, podaj reducer, a reducer
jest odpowiedzialny za tworzenie takiej inicjalnej wersji store'a, bo jest podawany
do tego, do tej funkcji Create Store, więc to od niego powinien
ten State wyjść,a my go tutaj nie zwracamy. Przecież
jeśli nie zwrócimy naszego state'u do naszego stora, no
to skąd ten store twitters miałby cokolwiek wiedzieć. Już widzimy,
że zniknął nam undefined, więc chyba trafiłam w dziesiątkę. Dobra,
to teraz na szybko twitters, wyciągamy
z naszego state'u i zwracamy twitters. Wchodzimy
do props'ów naszego komponentu, bingo i mamy nasze
twitter'y, więc teraz sobie odkomentujemy to,
co mieliśmy w tym miejscu. Wywalimy console log'a, wywalimy
fragment, bo już nam nie jest potrzebny. Ten fragment wrzuciłem tylko po to, żeby
po prostu nam w prettier nie formatował tego na jedną linijkę. Tutaj
spokojnie możemy sobie wyciągnąć twitters, bo żadnego
innego props'a w tym komponencie nie używamy i jak widzisz nasze
to twitter'y zostały zaczytane, ale tym razem wzięły
się one z naszego redux'a z naszego stare'a, więc udało nam
się podpiąć store pod nasz pierwszy widok i teraz twoim zadaniem będzie
dodanie tego samego do articles i do notes. Spróbuj połączyć to
wszystko razem. Wywal te dummy data stąd, bo już
nie jest to potrzebne. Możesz przenieść te obiekty, jeśli chcesz mieć także kilka notatek
na notes'ach i na articles. To możesz przenieść tutaj do reducer'a, a
w następnej lekcji pokażę ci co możemy zrobić, żeby w na przyszłość
debugować naszą aplikacje w trochę bardziej cywilizowany sposób. No, bo używanie
wszędzie console log'ów nie jest chyba najbardziej wygodną drogą, którą moglibyśmy
obrać. Także wszystko przed nami następnej lekcji.