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ść, zaczynamy nowy rozdział w kursie w którym opowiem ci jak
działa redux, czym jest właściwie redux, po co go potrzebujemy w naszych projektach
i najłatwiej, żeby to wytłumaczyć mogę pokazać to takiej bardzo
prostej grafice, mamy tutaj póki co trzy takie główne komponenty w
naszej aplikacji notes, twitters i articles. To są trzy osobne widoki,
które póki co te wszystkie rzeczy, które wpisywaliśmy w nich, czyli
to takie dummy data, te takie przykładowe notatki znajdowały się bezpośrednio
w tych komponentach, natomiast od teraz chcemy wprowadzić coś
co będzie takim centralnym repozytorium w naszej aplikacji, co będzie trzymać
wszystkie rzeczy w jednym miejscu i to miejsce nazywa się z store'm
i do stworzenia takiego stara potrzebujemy właśnie redux'a, czyli biblioteki
do zarządzania tym datalayer jak to się nazywa w naszych aplikacjach
i to w jaki sposób redux działa pokażę ci teraz na takiej
nieco bardziej skomplikowanej grafice, ale mimo wszystko jest to naprawdę bardzo
proste. Na początku może być to dość skomplikowane, żeby to zrozumieć
jak to wszystko działa. Natomiast uwierz mi, jest to naprawdę mega, mega
proste i w tym kursie pokażę ci właśnie jak to wszystko poukładać,
żeby miało to ręce i nogi. Zacznijmy od tego, że mamy w aplikacji już ten store
stworzony i on zawiera wszystkie informacje dotyczące notatek,
które znajdują się w naszej aplikacji, więc z naszego store'a, do
komponentu notes wysyłany jest aktualny stan. Powiedzmy, że mamy
na przykład w nim trzy notatki. W komponencie notatek mamy
później możliwość robienia z nimi różnych rzeczy, usuwania, dodawania
edycji tych notatek i to wszystko nazywa się akcjami, akcje
wysyłane są przez tak zwane Action Creators do reducer'ów i
teraz uwaga. Czym jest reducer, bo to jest chyba takie najbardziej skomplikowane
słowo w całym redux'ie. Reducer to nic innego jak taki kawałek dość
prostej logiki, który identyfikuje akcje po jej nazwie, czyli na przykład add note dodaje
notatkę taka akcja add note leci do reducer'a, reducer mówi okej,
ta akcja dodaje notatkę. To co muszę zrobić to muszę wejść do stanu
i dodać to co akcja mi wysłała, bo
akcja zawiera właśnie wszystkie informacje o tych notatkach i w redux'ie
właśnie jesteśmy zamknięci w takim trójkącie gdzie od store'a idziemy do komponentu.
Wysyłamy tam różne dane. Z komponentu możemy wysyłać
akcje, które zawierają jakieś modyfikacje, ale same nie mogą
modyfikować niczego w naszym storze dlatego wysyłają te akcje dole do
reducer'ów i dopiero reducer'y identyfikują te akcje i po identyfikacji
mogą działać na naszym storze, ważne jest też to że nas
store jest niemutowalny. Jeśli nie znasz jeszcze tego pojęcia to pokażę ci to później na przykładzie
o co w nim chodzi, natomiast jeśli znasz to już teraz wiesz, że po prostu obiekty
tablice, wszystkie rzeczy, które się znajdują naszym storze, nie będą mutowane,
nie będą zmieniane tylko będą aktualizowane poprzez specjalne właśnie metody
i póki co pewnie to wszystko może brzmieć jeszcze dość mogliście, ale
wcale się tym nie przejmuj, bo teraz napiszemy naprawdę bardzo prosty store, który
pokażę ci że redux tak naprawdę nie jest niczym skomplikowanym.
Przejdźmy sobie teraz do Code Pena, do którego pobrałem
sobie najnowszą wersję redux'a. Zauważ, że w
ogóle nie importuje tutaj React'a, ponieważ redux wcale nie wymaga
React'a do działania. Możemy to zrobić w zwykłym pliku js i on również wtedy
będzie działał, więc pierwsze co sobie zrobimy to zaimportujemy sobie Create Store z
naszego
redux'a, właściwie nie zaimportujemy tylko wyciągniemy sobie, zdestrukturyzujemy sobie te
funkcje. Teraz stworzymy const'a store, który
właśnie wywoła nam te funkcje, ale tutaj się jeszcze nic nie wydarzy, ponieważ create store
jako argument przyjmuje reducer, czyli
właśnie tego, nazwijmy go takiego robota, który ma do niego wjazd i który
może obsługiwać to co w tym storze się znajduje, więc
teraz stworzymy sobie funkcje, która się nazywa my reducer i reducer'y
zawsze przyjmują dwie rzeczy. State, czyli
ten obecny state, który już istnieje oraz
akcje, którą ma wykonać na naszym storze i tutaj jest jeden
problem. Jeśli my podamy tutaj my reducer to state
nie istnieje. W tym momencie nie mamy jeszcze żadnego state'u, nie
wykonaliśmy żadnej akcji, a już podajemy state jako argument do funkcji
create store, co możemy zrobić w takiej sytuacji, a możemy zainicjować
nasz state, w taki sposób, stworzymy
sobie obiekt, bo nasz store będzie obiektem i w
naszym storze zrobimy sobie notes
i to będzie pusta tablica po prostu utworzymy
nam tutaj miejsce do którego później będziemy mogli dodać notatki. Jak
już stworzymy sobie takiego const'a initial state, to dzięki
składni ES6 możemy powiedzieć, że słuchaj jeśli state jest undefined,
to wykorzystaj wtedy initial state, ta składnia
w tym miejscu to jest dokładnie jak byśmy zrobili if type
of state równa się defined to
wtedy state równa się initial state, więc
to jest taki skrót. jeśli go nie znasz, no to polecam, jest naprawdę fajny. Dlatego
właśnie warto znać ES6 kiedy piszemy już w React'cie i w tych nowych technologiach,
bo pełno jest takich skrótów, które pomagają nam po prostu w pracy, więc
kiedy mamy już zainicjowany state, w momencie kiedy podajemy nasz reducer do creator store to
teraz możemy sobie zobaczyć, co możemy zrobić z tym naszym storem. Tak
jak już mówiłem do naszych reducer'ów możemy podawać akcje, które odpowiednio
obsłużone mogą apdejtować nasz store, więc teraz stwórzmy sobie jakąś akcję.
Nazwiemy ją note action i akcje zawierają
przynajmniej dwie rzeczy, type i tutaj
możemy teraz i na przykład Add Note oraz payload i payload
to jest to co zawiera akcja, co chcemy przekazać do naszego store'a, w tym przypadku
może być to na przykład tytuł i jakiś
content i teraz w momencie kiedy stworzyliśmy już sobie nasz store tutaj, w
tym miejscu to posługując się constem store mamy dostęp do
kilku bardzo fajnych metod. Pierwszą z
nich, którą chcę ci pokazać jest dispatch, dispatch
służy właśnie do jak sama nazwa wskazuje dispatchowania akcji, czyli wysyłanie
akcji do reducer'a i teraz zanim ją wyślemy to jeszcze
taka krótka uwaga, bo możesz się zastanawiać dlaczego tu jest obiekt,
dlaczego on ma klucz title i klucz content. Jest to po prostu kształt
naszej notatki, więc to co podajemy w akcji qdd note to jest
najzwyklejsza w świecie notatka w formie obiektu, którą pokazywałem
ci już na przykład w komponencie twitter albo note,
mam je tutaj title, content,
tu mam jeszcze created i id, które na razie sobie omijamy, ale generalnie jest
to po prostu najzwyklejszy kształt naszej notatki i to właśnie wysyłamy w payloadzie
naszej akcji, więc teraz podajmy sobie dispatch'ujmy
sobie naszą akcję Note Action i w
momencie kiedy to zrobiliśmy, do reducer'a została podana nasza akcja
i możemy ją sobie wylogować właśnie tutaj przygotowałem consol loga,
który nam to pokazuje, a więc ta metoda dispatch może
na początku wydawać się magiczna, bo jakim cudem to co pisaliśmy tutaj pojawia
się nagle tutaj, ale właśnie o to w tym chodzi, że podając argument
w postaci akcji do metody dispatch ta metoda dispatch
wie co z nią zrobić ona po prostu wysyła to do redecer'a, mówi słuchaj mamy tutaj taką akcję
co my z nią dalej robimy i to właśnie reducer jest odpowiedzialny
za to co my dalej z nią zrobimy, ale o tym opowiem ci w następnej
lekcji.