Szukasz najlepszych specjalistów od wytwarzania oprogramowania? Znajdziesz ich w kilka kliknięć.

Kiedy używać Reduxa, a kiedy zostać przy Context API? Uprość swoją aplikację

30 lis 20182 min czytania

Dawid Karczewski

Senior full stack developer i CTO w Ideamotive.

isaac-benhesed-249427-unsplash

Skarga, którą często wyrażają niedoświadczeni programiści React, brzmi tak, że Redux w rzeczywistości komplikuje im pracę, zamiast ją upraszczać. To zrozumiałe – narzędzie to powstało do zarządzania przepływem danych w bardziej złożonych aplikacjach i przy prostych SPA czy stronach wydaje się przerostem formy nad treścią.

Problemy z nauką Reduxa:

  1. Programiści nie zawsze mają okazję popracować w dużym projekcie bez Reduxa - poznają tę technologię równolegle z rozpoczęciem pracy z Reactem. Przez to nie widzą, jakie problemy Redux miał rozwiązywać (no pain – no gain 🙂 ), jakie są alternatywy i dlaczego bywają wydajniejsze lub wygodniejsze
  2. Tutoriale Reduxa zwykle polegają na budowaniu prostych aplikacji lub funkcji, które równie dobrze można napisać w czystym JS. Dlatego pierwsze wrażenie programistów to zwykle konsternacja co do przeznaczenia tego narzędzia.

Dobrym przykładem kursu, który uczy mniej trywialnego materiału i dobrze tłumaczy Redux, jest „Advanced React and Redux: 2018 Edition” autorstwa Stephena Gridera.

Jakie problemy rozwiązuje Redux?

Oddzielenie „co się stało” od „co trzeba zrobić”

To nie jest oczywiste. Jeśli aplikacja powtarza wzorzec „komponent się wyrenderował i musi pobrać dane z API, żeby wyrenderować dzieci lub elementy listy”, będziemy po prostu wielokrotnie wywoływać akcje REQUEST i RECEIVE, bez niczego pomiędzy - to redundancja, którą można zastąpić prostymi wywołaniami asynchronicznymi. Nawet jeśli potrzebujesz Reduxa w aplikacji, powtarzanie tego samego wzorca w wielu reducerach uchodzi za złą praktykę. Możesz zastąpić je prostszym reducerem i użyć go ponownie (dodając parametr, na przykład paramName).

Przekazywanie propsów przez wiele komponentów, które ich nie używają

Ten problem nazywa się „prop drilling”. Takie propsy dokładają tylko dodatkowe linie kodu w komponentach. Możesz jednak rozwiązać ten problem za pomocą Contextu albo zmieniając kompozycję komponentów.

 

W powyższym przykładzie obiekt data jest dostępny dla wielu komponentów bez konieczności przekazywania go przez komponenty pośrednie (tutaj: ComponentWrapper).

Przekazywanie callbacków w górę przez komponenty, które ich nie potrzebują

Ten sam problem co z propsami (callbacki też są propsami), ale dane płyną w odwrotnym kierunku - co wydaje się sprzeczne z ideą Reacta (React renderuje bowiem z góry na dół).

Kiedy używać Reduxa?

Nawet twórcy i kontrybutorzy Reduxa powiedzą Ci, że powinieneś używać go z rozmysłem. Po dokładnym przemyśleniu architektury aplikacji możesz rozważyć to narzędzie w następujących przypadkach:

  1. Kiedy potrzebujesz middleware do różnych celów. Na przykład do logowania akcji, raportowania błędów, wysyłania kolejnych żądań zależnie od odpowiedzi serwera itd.
  2. Kiedy dane pochodzące z wielu endpointów wpływają na jeden komponent lub widok.
  3. Kiedy chcesz mieć większą kontrolę nad akcjami w swoich aplikacjach. Redux umożliwia śledzenie akcji i zmian danych, co bardzo upraszcza debugowanie.
  4. Kiedy nie chcesz, żeby odpowiedź serwera bezpośrednio zmieniała stan Twojej aplikacji. Redux dokłada warstwę, w której decydujesz, jak, kiedy i czy w ogóle te dane mają zostać zastosowane.
  5. Wzorzec obserwatora. Zamiast tworzyć wielu wydawców i subskrybentów w całej aplikacji, po prostu podłączasz komponenty do store'a Reduxa.

Kiedy Redux to przerost formy nad treścią, a Context API wystarczy?

Jeśli nie używałeś jeszcze Context API (jego nowa wersja pojawiła się w React 16.3, poprzednie API miało charakter raczej eksperymentalny i odradzano używanie go wprost w aplikacjach), warto spróbować go w sytuacjach, w których nie korzystasz z większości możliwości Reduxa. Oto warunki, w których Context może wystarczyć:

  1. Zarządzanie stanem dostępne z każdego komponentu. To za mało, żeby sięgać po Redux, który wprowadza zbyt dużo abstrakcji jak na taki cel.
  2. Middleware nie jest potrzebny. Reducery wykonują proste, przewidywalne działania, a kolejność otrzymywanych danych nie ma znaczenia dla aplikacji.
  3. Potrzebujesz czegoś w rodzaju danych globalnych („theme” to przykład, który często widuję, podglądając aplikacje w DevTools).

Podsumowanie

Redux to świetne narzędzie dla tych, którzy naprawdę je rozumieją i sięgają po nie wtedy, gdy wymaga tego architektura kodu. Dziś programiści mierzą się z wyzwaniami w utrzymaniu zastanego kodu, który bywa przekombinowany i mylący. Zastąpienie Redux Store Contextem z Reacta to propozycja, którą programiści React mogą rozważyć przy refaktoryzacji.

 

Jesteśmy Ideamotive – firmą tworzącą dedykowane aplikacje webowe. Budujemy najwyższej klasy aplikacje internetowe z kodem najwyższej jakości. Szukasz bohaterów, którzy pomogą Ci w kolejnym przedsięwzięciu? Napisz do nas!

Dawid Karczewski

Dawid jest full stack developerem. Tworzy aplikacje w Ruby on Rails i React Native od pierwszego pomysłu aż po wdrożenie. Buduje dla naszych klientów rozwiązania, które pomagają im rosnąć.

Zobacz wszystkie wpisy autora
im_ebook_cover_template 4 (2)

Ruby on Rails w Twoim kolejnym projekcie webowym

Kompletny przewodnik biznesowy

Czytaj teraz
Newsletter 9-1
Newsletter Ideamotive
Twój dwutygodniowy przegląd najgorętszych newsów technologicznych

Szukasz ekspertów od Reacta do swojego zespołu?

W naszej sieci talentów czekają dziesiątki zweryfikowanych specjalistów React.