Workshop repo for purpose of WarsawJS workshop#32
- sklonuj repozytorium
- zmień branch na
etap-0
- zainstaluj zależności
- odpal aplikację
Czym jest rekosillllcoooś tam?
- wydzielenie komponentów
- struktura folderów komponentów
- wspólne komponenty
- layout
- widoki/stany
- uwaga: nazwy komponentów warto nazywać biznesowo a nie technicznie
- wydzielenie nagłówka aplikacji jako części
layout
- wydzielenie listy oraz szczegółów do osobnych komponentów (widoki/stany)
- uwaga: funckje przekazywane jako propsy warto nazwać z prefixem
on
, np:onSearch
- uwaga: pobieranie danych przenieść na poziom tych komponentów
- przykład komponentu
App
po przeniesieniu listy i szczegółów
<div className="App"> <Header /> {detailsId ? ( <AccommodationDetails detailsId={detailsId} onBackToList={this.handleBackToList} /> ) : ( <AccommodationList onDetails={this.handleDetails} /> )} </div>
- przykład komponentu
- uwaga: funckje przekazywane jako propsy warto nazwać z prefixem
- wydzielenie powtarzalnych części JSX do reużywalnych komponentów
- uwaga: podobnie wyglądające części apkikacji to np: cena, rating czy przycisk udostępniania
- struktura folderów komponentów
- dodatkowo: otypowanie propsów przy wykorzystaniu
prop-types
- dodatkowo: wykorzystanie dynamicznego wybierania typu do powiązania enumów do komponentów (np. rodzaj
facility
na odpowiednią ikonę)
- wydzielenie logiki pobierania szczegółów do osobnego komponentu funkcyjnego
- użycie
useReducer
jako zamiennikRedux
- docs
- do hooka
useReducer
przekazać: reducer oraz stan inicjalny - hook zwraca tablicę z 2 elementami, pierwszy to stan reducera
state
a drugi to funkcja do wykonywania akcjidispatch
- implementacja reducera do pobierania szczegółów
- reducer to funkcja, która jako argumenty dostaje stan i akcje
- przykład stanu reducera
{ data: null, fetching: true, errors: null, }
- przykład wykonania akcji:
dispatch({ type: 'DETAILS_FETCH_SUCCESS', payload: data });
- przykład stanu reducera
- potrzebne są 3 akcje: rozpoczęcia pobierania, sukcesu oraz błędu
- DETAILS_FETCH_REQUEST
- DETAILS_FETCH_SUCCESS
- DETAILS_FETCH_FAILURE
- reducer to funkcja, która jako argumenty dostaje stan i akcje
- użycie
useEffect
jako alternatywa cyklu komponentu klasowego- hook przyjmuje 2 argumenty: efekt - funkcja, która wykona się za każdym razem gdy zmienią się zależności, które są drugim argumentem w postaci tablicy. Jeśli jakikolwiek z elementów tablicy zależności się zmieni, wtedy efekt wykona się ponownie.
- uwaga: funkcja efektu nie może być funkcją asynchroniczną
- w scope efektu implementujemy asynchroniczną funkcję pobierającą dane
- a następnie wywołujemy ją
- jako zależność efektu przekazujemy identyfikator szczegółów do pobrania
- hook przyjmuje 2 argumenty: efekt - funkcja, która wykona się za każdym razem gdy zmienią się zależności, które są drugim argumentem w postaci tablicy. Jeśli jakikolwiek z elementów tablicy zależności się zmieni, wtedy efekt wykona się ponownie.
react-router-dom
do obsługi routingu aplikacjiRoute
widoku listyRoute
widoku szczegółów- wykorzystanie
withRouter
do dodania do komponentu propsahistory
,- przykład:
export default withRouter(AccommodationList);
- props umożliwia zmianę routingu poprzez wywołanie metody push
- przykład:
this.props.history.push('/');
- przykład:
- przykład:
- routing na widok szczegółów ustawia parametr
id
w adresie, który zostanie wykorzystany do pobrania danych zamiast przekazywania identyfikator przez propsy- do odczytania wartości parametrów w adresie wykorzystamy
tiny-params
- docs
- przykład:
const { id } = tinyParams(window.location.href);
- do odczytania wartości parametrów w adresie wykorzystamy
- pozbycie się wszystkich powiązań widoków aplikacji do komponentu
App
, nie powinien zawierać stanu ani metod - zamiana na komponent funkcyjny klasy
App
- wydzielenie nowych
chunk
ów w routerze przy wykorzystaniu dynamicznych importów orazReact.lazy
- przykład:
const AccommodationList = lazy(() => import('./components/views/accommodation-list/AccommodationList'));
- przykład:
- obsługa ładowania komponentu przy wykorzystaniu
React.Suspense
- przykład:
<Suspense fallback={<div>Loading...</div>}> ... </Suspense>
- przykład:
- wykorzystanie komponentu
React.PureComponent
do optymalizacji nadmiarowej ilości przerenderowań komponentów klasowych - wykorzystanie utila
React.memo
do stworzenia zmemoizowanych komponentów funkcyjnych - obsługa błędów przy wykorzystaniu
componentDidCatch
- docs
- dodanie nowego komponentu wrappującego, który w przypadku przechwycenia błędu ustawia swój stan na błędny i zamiast wyświetlać
children
, wyświetla komunikat błędu
- memoizacja pracochłonnych obliczeń z wykorzystaniem
useMemo
HOC
do obsługi stanu ładowania -withFetching
- docs
- przykład:
const withSomething = Component => props => ComponentWithSomething
- jeśli chcemy przekazać opcje
const withSomething = options => Component => props => ComponentWithSomething
- wykorzystanie
withFetching
do obsługi ładowania listy i szczegółów
- dodatkowo: obsługa stanu błędu analogicznie