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ć prostą akcje, która będzie usuwać wybrany
element z naszych notatek czy to będą notatki czy twittery czy artykuły, to
nie ważne, ponieważ mamy tutaj dynamiczny klucz, który podajemy w naszym reducerze,
w tym miejscu, więc teraz to wszystko podłączymy do naszego
komponentu card, który powinien zajmować się właśnie usuwaniem tych
notatek z racji, że ma tutaj swój button remove, więc teraz użyjemy
sobie znanej ci już biblioteki React Redux i zaimportujemy z niej Connect,
a dodatkowo
do naszego komponentu zaimportujemy sobie naszą akcję, która nazywa się remove item. Znajduje
się ona w Actions i teraz to, co musimy zrobić, to
użyć Connect w taki sam sposób, jak ostatnio używaliśmy do mapStateToProps
i teraz to co jest ważne w Connect to to, że ta
funkcja przyjmuje normalnie dwa argumenty. Pierwsza to mapStateToProps,
a druga to
funkcja, której teraz potrzebujemy, czyli mapDispatchToProps, oczywiście
musimy ją utworzyć. Z tym, że nie potrzebujemy tutaj w tym komponencie mapStateToProps,
ale żeby Connect wiedział że podajemy to mapDispatchToProps
jako drugi argument, to musi być drugi argument to ten pierwszy musi
się pojawić i skoro tutaj nic nie podajemy to możemy po prostu podać
null'a. Żadnej krzywdy nam to nie zrobi, a w ten sposób Connect będzie wiedział, że podajemy
akcje do dyspatcho'owania w naszym storze i teraz oczywiście musimy
sobie stworzyć mapDispatchToProps i teraz
podobnie jak mapStateToProps przyjmował state jako nasz parametr
w tym miejscu, bo state został podawany później do naszej
funkcji mapStateToProps przez Connect, tak samo Connect pozwala
nam na podanie tutaj do naszej funkcji czegoś co się nazywa dispatch i
dispatch to jest po prostu metoda, która pozwala nam na dyspatch'owanie
funkcji do naszych reducer'ów i nasz mapDispatchToProps będzie
zwracać obiekt, w którym musimy sobie stworzyć klucz. Ten klucz będzie
nazwą funkcji, którą podamy tutaj do naszego button'a na onclick, więc
na razie zrobię ją nieco inną niż docelowo będę
chciał, tylko po to, żeby coś ci pokazać pokazać żeby ci się nie myliłp, więc
teraz zrobimy sobie tutaj na przykład my function, nasza
funkcja może przyjmować argument a i argument b. Zaraz
to wszystko stanie się jasne, nie martw się i ta
nasza funkcja będzie zwracać nam dispatch, w którym
wywołany sobie zaimportowane remove item i nasze
remove item przyjmuje dwa argumenty, item type
i id, więc te argumenty, które zostaną podane
do my function mogą nam posłużyć jako argumenty w naszym
remove item. Oczywiście, żeby nam się to nie myliło i żebyśmy
wiedzieli co podajemy, to wszystko powinno nazywać się tak samo. Czyli ta funkcja,
którą wykorzystano w naszym JSX'ie również powinna nazywać się remove item, chociaż
to nie jest to, co tutaj wywołujemy. To jest po prostu nazwa naszego props'a i podobnie
nazwy naszych argumentów też powinny być takie same, czyli item type i id. Mam
nadzieję, że to jest dla ciebie jasne, jak to działa i zaraz pokażę ci, że to faktycznie działa.
Przenieśmy się teraz do naszego JSX'a i jak
już wiesz funkcja Connect pozwala nam na dodanie właśnie
tego co tutaj stworzyliśmy do naszego JSX'a, więc remove item stało
się po prostu naszym props'em, który jest funkcją. Po
przecinku możemy sobie zdestrukturyzować nasze remove item, żeby nie pisać this props
remove item, tylko samo remove item. W naszym button'ie,
na kliknięcie, wywołany
sobie właśnie nasze remove item, ale z racji, że remove item przyjmuje
dwa argumenty, id i card type, w naszym przypadku, to
musimy tutaj stworzyć funkcję strzałkową, która zwraca nam dopiero naszą
funkcję, którą chcemy wykonać po kliknięciu. Ta składnia powinna być ci znana
już z poprzedniego kursu, więc nie będzie, nie będziemy się przy niej dłużej zatrzymywać i
tutaj props type nazywa się inaczej niż item type, ale
wiemy, że jakby nazwa, którą tutaj podajemy jest dokładnie taka sama. W
następnej lekcji zaczniemy już powoli uściślać to jak
nazywa się ten props i skąd go będziemy pobierać, ponieważ zastosujemy sobie context w całej
naszej aplikacji, w celu właśnie podniesienia readability, czyli
czytelności naszego kodu, ale teraz podajemy po prostu do remove item card type
oraz id. Jeśli wszystko dobrze zrobiliśmy, jeśli
to remove item zostało podpięte do stare'a. Jeśli te parametry się zgadzają
tutaj, to po kliknięciu na remove nasz Hello
Roman powinien zniknąć i tak
właśnie się stało. Jeśli po poprzedniej lekcji udało ci się podłączyć pod store
pozostałe widoki, to tutaj również będzie to działać i możemy
sobie usunąć wszystkie notatki w naszej aplikacji i to
teraz. No i teraz musimy zacząć je dodawać, więc tym zajmiemy się powoli
w następnej lekcji. Jeszcze czeka nas tylko drobny refaktoring, który podniesie
jakość kodu naszego projektu, ale zanim skończymy te lekcje,
to tutaj jeszcze taka drobna uwaga, bo wiadomo, że każdy popełnia błędy.
Ja właśnie jeden popełniłem i na szczęście mamy ESlinta, który mi o tym
powiedział, że nie możemy mieć zadeklarowanego remove item dwa razy w
tym samym pliku, mimo że jest to jakby w innym scope'ie, więc tutaj
importujemy sobie remove item, a tutaj sobie destrukturyzujemy remove
item, czyli tak naprawdę tak jakbyśmy stworzyli sobie właśnie osobnego consta, więc
musimy te akcje nazwać inaczej, ale ona z kolei jest
eksportowana jako named export, więc nie możemy nazwać jej
podobnie jak importowaniu default'owych ekspertów jakkolwiek. Natomiast,
mamy coś takiego jak has i wtedy możemy zrobić remove item has
remove item action, czyli importujemy remove item, ale
pod tą nazwą. Teraz jedyne, co musimy zrobić to podmienić ją w tym miejscu i wszystko
działa i to tyle, ESlint się od nas odczepił, mówię
jeszcze tylko, że nie walidujemy sobie tego w naszym
prop types, więc szybko to naprawmy. Okej,
jesteśmy gotowi do dalszej pracy.