od Podstaw
5 godz. 59 min · ReactJS · Full-stack i Programowanie
Michał JabłońskiReact przeszedł długą ścieżkę rozwoju i część z jego funkcjonalności nie są już powszechnie używane. Dlatego w tym kursie skupimy się na najnowszych technikach pracy z biblioteką - poznasz współczesne podejście do budowania komponentów z wykorzystaniem hooks (useState, useEffect), zrozumiesz zasady kompozycji i zarządzania stanem aplikacji. Pokażemy Ci też jak efektywnie korzystać z narzędzi deweloperskich, debugować kod i wdrażać aplikacje na produkcję z użyciem współczesnych platform jak Vercel.
Hooki to fundament nowoczesnego Reacta, który całkowicie zmienił sposób tworzenia komponentów. W kursie nauczysz się efektywnie zarządzać stanem aplikacji używając useState, wykorzystywać useEffect do operacji lifecycle i side-effects, oraz poznasz reguły korzystania z hooków. Wszystko to przećwiczysz w praktycznych zadaniach, takich jak implementacja filtrowania listy elementów, gdzie zastosujesz zdobytą wiedzę w realnym scenariuszu.
Obsługa formularzy to nieodłączny element każdej aplikacji webowej. Pokażemy Ci jak kontrolować wartości pól input, wykorzystać popularną bibliotekę Formik do zarządzania złożonymi formularzami oraz implementować walidację danych. Wiedza ta zostanie utrwalona poprzez praktyczne zadanie, w którym rozwiniesz formularz o dodatkowe pola i zastosujesz poznane techniki w rzeczywistym przypadku użycia.
Większość aplikacji wymaga komunikacji z serwerem. Nauczysz się jak poprawnie wykonywać operacje asynchroniczne w komponentach React, obsługiwać stany ładowania i błędów, oraz efektywnie korzystać z klienta HTTP do zapytań AJAX. Zaczniesz od pracy z przygotowanym mockiem API, by następnie przejść do prawdziwej integracji z back-endem. W praktycznym zadaniu zaimplementujesz pełny przepływ danych - od pobrania, przez wyświetlenie, aż po wysłanie na serwer.
Poza budową aplikacji React, w kursie znajdziesz także moduł poświęcony wdrażaniu aplikacji na produkcję. Poznasz prawidłową konfigurację serwera produkcyjnego dla architektury SPA, nauczysz się zarządzać zmiennymi środowiskowymi poprzez pliki .env oraz przeprowadzisz deployment na platformie Vercel. Dzięki temu Twoja aplikacja będzie nie tylko działać lokalnie, ale także będzie gotowa do użycia przez realnych użytkowników w internecie.
Nowoczesny React stworzyliśmy z myślą o osobach, które chcą nauczyć się Reacta i jednocześnie znają JavaScript. Niezależnie od tego, czy React jest Twoim pierwszym frameworkiem, czy masz już doświadczenie w pracy np. ze Svelte czy Vue, ten materiał jest dla Ciebie. Wskazane jest również posiadanie ogólnej wiedzy na temat tworzenia interfejsów z HTML i CSS oraz obsługi narzędzi takich jak Git czy podstawy pracy z terminalem.
Poprzednie przykłady były stosunkowo proste.
Zarówno tutaj, jak i tutaj mamy do czynienia z typem prostym.
Ten typ prosty jest aktualizowany.
Co jednak, gdybyśmy chcieli tutaj zaznaczać osoby na liście?
Co musimy wziąć pod uwagę?
Zwróć uwagę, że tutaj selected names to object.
Dokładnie jest to array array stringów co prawda, ale chcemy jakoś mieć informację
zwrotną, że coś zostało zaznaczone.
Spróbujmy sobie to przerobić jako właśnie juz state.
I pójdźmy tu sobie na zasadzie takiej, że selected names to będzie ta tablica w
której mamy selectowane imiona i set selected names.
Zgodnie z konwencją możemy to aktualizować, ale teraz
zaktualizujemy całą tablicę.
Jak to zrobić?
Przede wszystkim musimy uzbroić panel block w jakąś metodę, którą
będziemy sobie tutaj przekazywać.
Czyli mówiąc dokładniej chcemy przekazywać funkcję callback, który będziemy
wywoływać tutaj z panel block.
Można sobie wyobrazić, że to będzie on select i tu będzie
proptypes funk jako funkcja.
Zróbmy sobie tak, żeby on select nie był wymagany, czyli nie jest required, tylko
po prostu zrobimy sobie, że on select ma wartość domyślną jako pusty callback.
Zobacz puste arrow function.
Natomiast jeżeli ktoś zrobi onClick tutaj, to chcemy sobie wywołać on select, tak?
Czyli z naszej logiki biznesowej wynika, że my mamy taki callback jak on select.
Natomiast jak gdyby z tego natywnego elementu encore.
Jeżeli ktoś zrobi klika, to my chcemy wywołać ten select, który ktoś przekazał.
Wars case scenario będzie to po prostu pusty select i zobacz, że
ten komponent jest ogłupiony.
Nie ma pojęcia skąd przychodzą te propsy ani dokąd to zmierza.
Czyli kto odbiera to on select.
I dokładnie to podkreślę Ci na sam koniec tego przykładu, ponieważ moglibyśmy sobie
pomyśleć, że przecież zamiast robić tutaj stan, gdzie
będziemy mieli selectowane imiona, można by było tutaj Modyfikować
selected na true false.
To prawda, ale jeżeli modyfikowalibyśmy tutaj true false i nawet to odwracali,
czyli tutaj bazowali na tym typie prostym, to wtedy ten komponent wiedziałby jaki
jest jego wewnętrzny stan, że jest selectowany albo nie, ale nie
wiedzielibyśmy dokładnie co jest selectowane.
No właśnie nie mamy informacji co zostało zaznaczone, a my potrzebujemy tą listę
selectowanych imion, żebyśmy później wiedzieli na podstawie których imion
będziemy chcieli zrobić losowanie.
Więc w takim układzie chcemy, żeby to nam działało, ale stan danych chcemy mieć
tutaj na samej górze, na PeoplePage.
Możesz się spotkać z terminem wznoszenia stanu.
To właśnie byłaby taka sytuacja tutaj, gdybyśmy mieli stan wewnętrzny tego
komponentu, ale przenosimy go do komponentu rodzica, ponieważ komponent
rodzica będzie chciał mieć informację, które konkretnie elementy
zostały zaznaczone.
W takim przypadku mamy tutaj Select i Panel block.
To mogę już zamknąć, A tutaj Przerzucimy sobie onSelect i zróbmy sobie tutaj
funkcję taką jak HandleSelect i to zostanie wywołane w momencie, w
którym klikniemy sobie to OnSelect i chcielibyśmy sobie zobaczyć, co
dokładnie zostanie zaselektowane.
Więc tutaj celowo robię sobie takiego callbacka, żeby tutaj
handleSelect podać name.
Zobacz, że teraz handle select zostanie wywołany z konkretnym nameem i w tym
układzie setSelectedNames możemy uruchomić.
I jedyna rzecz, o której musimy teraz pamiętać to to, że nie chcemy
modyfikować i mutować stanu tego obiektu.
To znaczy nie chcemy użyć tutaj SelectedNames push, bo byłaby to
modyfikacja na zasadzie mutacji danych w tej tablicy.
My chcemy zamiast tego przygotować nową tablicę na podstawie tych selected names,
które już są i tego dodatkowego name.
Czyli tworzymy nową tablicę.
O tym musisz pamiętać, że jeżeli używasz state, to musisz używać Shallow Copy tych
elementów, które chcesz aktualizować.
Jeśli masz do czynienia z typami złożonymi, czyli complex type, chcemy
aktualizować poprzez wrzucenie nowych obiektów.
W tym wypadku powinniśmy mieć możliwość selectowania, ale nie da
się tego deselektować.
Zauważ, że nie jesteśmy w stanie odwrócić tego stanu rzeczy.
Dlaczego?
Dlatego, że powinniśmy najpierw sprawdzić, czy dane imię już jest za selectowane,
czyli selected names includes i tutaj by było name.
Jeżeli tak, to chcemy zrobić troszeczkę inną rzecz, bo chcielibyśmy się pozbyć
wtedy tego name z tych selected names.
Czyli tutaj jeżeli mamy selected name is the name, to chcemy
zrobić set selected names.
Tak jak do tej pory, ale chcielibyśmy odfiltrować, czyli utworzyć nową tablicę
na zasadzie selected name filter i chcemy odfiltrować imię, które tutaj się pojawia.
Czyli imię nie może być takie jak to, co przekazujemy tutaj.
Wtedy tu zostanie utworzona nowa tablica.
Zobacz, że ten filtr z programowania funkcyjnego.
On tworzy nową tablicę, w której nie zostanie przekazane to imię,
którego chcemy się pozbyć.
Teraz tutaj potrzebuję return dlatego, że nie chciałbym, żeby to się wykonało.
Ta część kodu. Jeżeli wpadniemy w tego IFA, Tak.
Możemy tu zastosować składnię if else.
Ja zrobię po prostu if i return w środku ifa, tak żeby ta linia
14 nie została wywołana.
Jeśli ten warunek zostanie spełniony.
I teraz powinniśmy zobaczyć eleganckie zaznaczanie i odznaczanie naszych
elementów, Więc widzimy, że wszystko nam tutaj działa dokładnie
tak, jak byśmy chcieli.
Możemy sobie jeszcze zabrać z tego naszego widoku głównego ten sample button
tutaj, jeżeli go sobie zakomentujemy.
I tutaj.
None use false dla sample buttona.
Zostawmy go sobie tutaj tak, żeby został nam w celach naukowych.
Natomiast widzimy, że tutaj jesteśmy w stanie teraz zaznaczać elementy,
które chcielibyśmy losować.
I tak stan będzie się zachowywał w momencie, w którym chcemy
aktualizować to na obiektach.
Teraz zwróć uwagę na jedną rzecz.
Dostajemy informację zwrotną, czyli na początku możemy mieć niezaselectowane nic,
ale dostajemy informację zwrotną właśnie tutaj co zostaje zaselectowane
poprzez to Select.
A dodatkowo, ponieważ nasz stan mieszka tutaj w PeoplePage, a nie w środku Panel
Blog to panel Blog na podstawie is selected będzie się zaznaczał,
odznaczał, natomiast nie mam pojęcia kto odbiera to on select.
W ten sposób jednocześnie sam nie decyduje o swoim stanie wewnętrznym,
ponieważ decydują o tym props.
Z drugiej strony, jeśli zmieniamy cokolwiek w stanie, czyli tutaj useState,
te nowe propsy zostają przekazane i to jest wyliczane na nowo.
No i trzecia sprawa to jest to, że React sam wie, co powinien zaktualizować w danym
momencie, więc my nie musimy się tym przejmować.
Natomiast mamy tablicę wszystkich zaznaczonych imion, więc wiemy
z czego mamy robić losowanie.