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ść, z racji, że nasz user id już siedzi
w naszym storze, to teraz możemy pobrać sobie konkretny typ notatek do
konkretnego widoku i zrobimy to też za pomocą redux'a, generalnie
mechanizm będzie taki, że wchodząc na jakieś widok po raz pierwszy pobieramy
sobie notatki do redux'a, do store'a i później już z tego store'a
to serwujemy. Wejdźmy sobie zatem na przykład do twitter'ów i stwórzmy
logikę, która będzie za to odpowiadać, to co chcemy zrobić to stworzyć
sobie z tego komponentu klasę, nasze twitter'y nadal będziemy pobierać sobie
z props'ów, ponieważ to już mamy podłączone do store'a, natomiast chcę tutaj zrobić
jeszcze jedną rzecz, a mianowicie dodać component did mount i
to właśnie wewnątrz tej metody chciałbym dokonać dispatch'a
do konkretnej akcji, która będzie nam pobierać nasze notatki, więc
teraz oprócz mapStateToProps chciałbym jeszcze zrobić map dispatch
to props w którym zwrócimy sobie fetch twitters. Na
razie nic tutaj nie wrzucimy, ponieważ musimy tę akcję najpierw stworzyć, więc teraz
wejdziemy sobie do naszego pliku z akcjami i stworzymy sobie consta
fetch items. Będzie zawierać item type a teraz
tutaj w naszym dispatch'u, tak jak wcześniej korzystaliśmy z redux thunk,
tak teraz tutaj jako drugi parametr możemy sobie wyciągnąć jeszcze
get state. Pamiętasz to na pewno w pierwszych lekcji o redux'ie, get state
będzie nam zwracać obecny stan naszego store'a i wtedy będziemy mogli
sobie pobrać ten user id, który będzie nam potrzebny do tego zapytania. Możemy
sobie skopiować nawet te const'y i skopiujemy
sobie też strukturę tego zapytania, bo ona będzie bardzo podobna, tylko
tutaj zamiast AUTH zrobimy sobie FETCH i teraz
jeśli zerkniemy sobie na nasz endpoint, w tym miejscu, to
podajemy jako query params dwie rzeczy, user id i type, endpoint
wygląda w ten sposób, tym razem jest
to get, a nie post i w
get'ie robimy dodatkowy obiekt z konfiguracją
i tutaj dopiero podajemy params i podajemy parametry,
które potrzebujemy. W tym przypadku będzie to type,
gdzie podamy item type, a drugim parametrem będzie
user id. Możemy je wyciągnąć za pomocą właśnie funkcji get state user id i
teraz skoro już te akcje przygotowaliśmy. Na razie nic w naszym reducerze
jeszcze nie robimy, będziemy sobie wypluwać payload, który tutaj wpisaliśmy.
Zobaczymy czy to działa, więc teraz przechodzimy
do twitter'ów i w map dispatch to props, które możemy
już podać do naszego connect'a, stworzymy sobie funkcje strzałkową, tym
razem pustą, która będzie nam dispatch'ować akcje,
którą zaimportujemy, akcja nazywa się fetch
items i fetch items w naszym widoku będzie przyjmować twitters. Teraz
to, co chcemy zrobić to na component did mount wywołać this props fetch items. Odpalimy
sobie naszą konsolę, wejdziemy do twitter'ów, okej
i mam jakiś błąd i widzimy,
że dispatch is not the function, więc pierwsza lampka jaka powinna nam się zapalić to
czy mamy dobrą kolejność w connect'ie, bo pamiętamy, że mapstatetoprops zawsze
musi być pierwsza. Jak widzimy, było drugie, więc teraz
jest okej i problem jest tylko taki, że
za każdym razem kiedy odświeżamy naszą stronę to nasz store
ginie, więc musimy podawać na nowo user
id i teraz jak się zalogowaliśmy i nie odświeżyliśmy naszej strony, możemy
wejść do twitter'ów i zobaczymy, że pobraliśmy tutaj
dwa różne twitter'y, więc możemy sobie przejść
do naszego pliku z actions, upewnić
się, że wszystko tutaj jest okej. Widzę, że tak, więc teraz możemy przyjść do reducers
i stworzymy sobie coś takiego, zaimportujemy
sobie tylko te typy akcji, które nam tutaj doszły. Teraz
już na pewno możemy sobie wywalić naszego consta z dummy data, initial state
stworzymy jako pustą tablicę, jako pusty obiekt
właściwie i teraz stwórzmy sobie tutaj akcje
dla fetch success. Wrzucamy oczywiście
poprzedni stan i teraz tutaj również potrzebowalibyśmy tego dynamicznego
klucza, który pozwoli nam dodać nasza item do konkretnej tablicy, więc
możemy je sobie wyciągnąć teoretycznie z jakiegoś elementu, który dostajemy
backend'u na przykład type twitters tutaj mamy, ale równie dobrze moglibyśmy
to po prostu obsłużyć dla naszej akcji w taki
sposób, że wyciągniemy sobie data naszego z naszego
response'a, następnie wprowadzimy tutaj spread operator z tym date
i dodatkowo jeszcze podamy tutaj nasz item type
i w poprzednim reducerze to to się
nazywało item type, więc
będziemy mieć spójność w tym miejscu, więc teraz możemy sobie
zastosować dokładnie tą samą składnię, którą mieliśmy tutaj i biorąc
pod uwagę, że nasza odpowiedź serwera będzie nadpisywać wszystkie itemy, które mamy w naszym storze,
nie będziemy tu tworzyć logiki, która porównuje na przykład te item'y i pobiera tylko te, które są
potrzebne. W takim razie możemy po prostu stworzyć sobie action
payload data. Okej, mamy błąd, ponieważ
data nie jest iterable, czyli nie jest tablicą. Zaraz zobaczymy, wróćmy
sobie do naszej akcji i spróbujemy skonsologować nasze data.
Okej, to jest właśnie
ten problem, o którym mówiłem, musimy być zalogowani i w
tej chwili mamy data, które jest tablicą i ta tablica
ma dwa obiekty, więc teoretycznie możemy użyć sobie data bez tego spread
operator'a i item type po prostu będzie osobno, okej
w tej chwili to składnia powinna działać. Zaraz zobaczymy, okej,
coś się pojawiło i coś się zepsuło. Zaraz zobaczymy. Wszystko rozbija się głównie
o to, że id, które tutaj mamy, teraz jest z podkreślnikiem, ponieważ
w takiej formie dodaje to id nasz backend i nie będziemy się tym za
bardzo przejmować. Możemy to użyć w taki sposób i dodatkowo tutaj
mapujemy, to również to id powinna być z podkreślnikiem, chociaż
na to akurat będzie sposób, żeby tego uniknąć. Dobra, ale udało nam się pobrać
nasze dwa item'y z naszego backend'u i wyświetlić
je mimo tych kilku niewinnych błędów, które naprawimy sobie następnej lekcji.