Dlaczego warto korzystać z Redux nad Facebook Flux? [Zamknięte]


1126

Przeczytałem tę odpowiedź , zmniejszając płytę kotła, przejrzałem kilka przykładów GitHub, a nawet spróbowałem trochę przebudować (aplikacje do zrobienia).

Jak rozumiem, oficjalne motywacje redux doc dostarczają profesjonalistów w porównaniu do tradycyjnych architektur MVC. ALE to nie daje odpowiedzi na pytanie:

Dlaczego powinieneś używać Redux zamiast Facebook Flux?

Czy to tylko kwestia stylów programowania: funkcjonalny czy niefunkcjonalny? Czy pytanie dotyczy umiejętności / narzędzi programistycznych wynikających z podejścia redux? Może skalowanie? Czy testowanie?

Czy mam rację, jeśli powiem, że redux jest fluktuacją dla osób pochodzących z języków funkcjonalnych?

Aby odpowiedzieć na to pytanie, możesz porównać złożoność punktów motywacyjnych implementacji redux na flux vs redux.

Oto punkty motywacyjne z oficjalnych motywacji redux doc :

  1. Obsługa optymistycznych aktualizacji ( jak rozumiem, nie zależy to od 5. punktu. Czy trudno jest zaimplementować go na Facebooku? )
  2. Renderowanie na serwerze ( może to zrobić również facebook flux. Jakieś korzyści w porównaniu do redux? )
  3. Pobieranie danych przed wykonaniem zmiany trasy ( dlaczego nie można tego osiągnąć na Facebooku? Jakie są korzyści? )
  4. Hot Reload ( Jest to możliwe dzięki React Hot Reload . Dlaczego potrzebujemy redux? )
  5. Funkcja cofania / ponawiania
  6. Jakieś inne punkty? Jak trwały stan ...

73
Redux to implementacja „Facebook Flux”. Flux nie jest biblioteką ani frameworkiem. Jest to po prostu zalecana architektura dla aplikacji internetowych. Nie rozumiem, jak można porównać konkretną implementację z abstrakcyjną koncepcją, która ją motywowała. Rzeczywista implementacja architektury Flux na Facebooku to Relay, a wersja open source jest wciąż w bardzo wczesnym stadium. facebook.github.io/relay
Charlie Martin

2
@CharlieMartin Przez FB Flux Mam na myśli aplikacje takie jak ten github.com/facebook/flux/tree/master/examples . Mój obecny projekt jest napisany na FB Flux (z powodu FB Flux). Jeśli chcesz, możesz pomyśleć jako architektura Redux nad architekturą FB Flux.
VB_

2
Teraz rozumiem. Chcesz porównać przykład Facebooka Implementacja Fluxa z implementacją Redux Flux
Charlie Martin

13
Relay nie jest implementacją Flux - Relay / GraphQL bardziej zajmuje się zarządzaniem pobieraniem danych / zapytaniami z serwerem, podczas gdy Flux zajmuje się głównie strukturalizacją przepływu danych między modelami danych po stronie klienta i komponentami widoku. Jednak nakładają się na siebie: na Facebooku mamy aplikacje zbudowane w całości przy użyciu Fluxa, w całości przy użyciu Relay lub obu. Pojawia się jeden wzorzec, który pozwala Relay zarządzać większością przepływu danych dla aplikacji, ale używając bocznych magazynów Flux do obsługi podzbioru stanu aplikacji
Hal

Odpowiedzi:


1958

Redux autor tutaj!

Redux nie jest , że różni się od topnika. Ogólnie rzecz biorąc ma tę samą architekturę, ale Redux jest w stanie skrócić niektóre narożniki złożoności, wykorzystując funkcjonalną kompozycję, w której Flux używa rejestracji wywołania zwrotnego.

W Redux nie ma zasadniczej różnicy, ale uważam, że sprawia, że ​​pewne abstrakcje są łatwiejsze lub przynajmniej możliwe do wdrożenia, które byłyby trudne lub niemożliwe do wdrożenia we Fluxie.

Skład reduktora

Weźmy na przykład paginację. Przykład routera My Flux + React obsługuje podział na strony, ale kod tego jest okropny. Jednym z powodów, dla których jest to okropne, jest to, że Flux sprawia, że ​​nienaturalne jest ponowne używanie funkcji w różnych sklepach. Jeśli dwa sklepy muszą obsługiwać paginację w odpowiedzi na różne działania, albo muszą dziedziczyć ze wspólnego magazynu podstawowego (źle! Blokujesz się w konkretnym projekcie, gdy korzystasz z dziedziczenia), lub wywołać zewnętrznie zdefiniowaną funkcję z poziomu moduł obsługi zdarzeń, który będzie musiał jakoś działać w prywatnym stanie sklepu Flux. Cała sprawa jest bałaganiarska (choć zdecydowanie w dziedzinie możliwej).

Z drugiej strony, dzięki Redux paginacja jest naturalna dzięki składowi reduktora. Reduktory są w dół, więc możesz napisać fabrykę reduktorów, która generuje reduktory stronicowania, a następnie użyć jej w drzewie reduktorów . Kluczem do tego, dlaczego jest to tak łatwe, jest to, że we Fluxie sklepy są płaskie, ale w Redux reduktory można zagnieżdżać za pomocą funkcjonalnej kompozycji, podobnie jak można zagnieżdżać komponenty React.

Ten wzór umożliwia także wspaniałe funkcje, takie jak cofanie / ponawianie kodu bez użytkownika . Czy potrafisz sobie wyobrazić podłączanie Cofnij / Powtórz do aplikacji Flux, która jest dwoma liniami kodu? Ledwie. W Redux jest to ponownie dzięki wzorowi składu reduktora. Muszę podkreślić, że nie ma w tym nic nowego - jest to wzorzec zapoczątkowany i szczegółowo opisany w Architekturze Wiązów, na który sam wpływ miał Flux.

Renderowanie serwera

Ludzie dobrze renderowali na serwerze za pomocą Fluxa, ale widząc, że mamy 20 bibliotek Fluxa, z których każda próbuje uczynić serwer „renderowaniem łatwiejszym”, być może Flux ma pewne szorstkie krawędzie na serwerze. Prawda jest taka, że ​​Facebook nie renderuje zbyt wiele serwerów, więc nie byli tym bardzo zaniepokojeni i polegają na ekosystemie, aby to ułatwić.

W tradycyjnym systemie Flux sklepy są singletonami. Oznacza to, że trudno jest oddzielić dane dla różnych żądań na serwerze. Nie niemożliwe, ale trudne. Właśnie dlatego większość bibliotek Flux (jak również nowe narzędzia Flux ) sugerują teraz używanie klas zamiast singletonów, dzięki czemu można tworzyć instancje sklepów na żądanie.

Nadal istnieją następujące problemy, które musisz rozwiązać we Fluxie (samodzielnie lub przy pomocy swojej ulubionej biblioteki Flux, takiej jak Flummox lub Alt ):

  • Jeśli sklepy są klasami, jak je utworzyć i zniszczyć za pomocą dyspozytora na żądanie? Kiedy rejestruję sklepy?
  • Jak uwodnić dane ze sklepów, a następnie uwodnić je na kliencie? Czy muszę zaimplementować do tego specjalne metody?

Wprawdzie frameworki Flux (nie Vanilla Flux) mają rozwiązania tych problemów, ale uważam, że są zbyt skomplikowane. Na przykład, speszyć kogoś prosi, aby wdrożyć serialize()i deserialize()w swoich sklepach . Alt rozwiązuje ten problem, zapewniając takeSnapshot()automatyczne serializowanie stanu w drzewie JSON.

Redux idzie dalej: ponieważ istnieje tylko jeden sklep (zarządzany przez wiele reduktorów), nie potrzebujesz żadnego specjalnego API do zarządzania (ponownym) nawodnieniem. Nie musisz „przepłukiwać” ani „nawadniać” sklepów - jest tylko jeden sklep i możesz odczytać jego aktualny stan lub utworzyć nowy sklep z nowym stanem. Każde żądanie otrzymuje osobną instancję sklepu. Przeczytaj więcej o renderowaniu serwerów za pomocą Redux.

Ponownie, jest to przypadek czegoś możliwego zarówno we Fluxie, jak i Reduxie, ale biblioteki Flux rozwiązują ten problem, wprowadzając mnóstwo API i konwencji, a Redux nawet nie musi go rozwiązać, ponieważ nie ma tego problemu w pierwsze miejsce dzięki prostocie koncepcyjnej.

Doświadczenie programistów

W rzeczywistości nie zamierzałem, aby Redux stał się popularną biblioteką Flux - napisałem to, pracując nad moim wystąpieniem ReactEurope na temat przeładowywania w czasie podróży . Miałem jeden główny cel: umożliwić zmianę kodu reduktora w locie, a nawet „zmienić przeszłość” poprzez wykreślanie działań i zobaczyć, jak stan jest przeliczany.

Nie widziałem żadnej biblioteki Flux, która byłaby w stanie to zrobić. React Hot Loader również nie pozwala ci tego zrobić - w rzeczywistości psuje się, jeśli edytujesz sklepy Flux, ponieważ nie wie, co z nimi zrobić.

Kiedy Redux musi ponownie załadować kod reduktora, dzwoni replaceReducer(), a aplikacja działa z nowym kodem. W Flux dane i funkcje są zaplątane w sklepach Flux, więc nie można „po prostu zastąpić funkcji”. Co więcej, będziesz musiał jakoś ponownie zarejestrować nowe wersje w Dispatcherze - coś, czego Redux nawet nie ma.

Ekosystem

Redux ma bogaty i szybko rozwijający się ekosystem . Wynika to z faktu, że zapewnia on kilka punktów rozszerzenia, takich jak oprogramowanie pośrednie . Został zaprojektowany z myślą o przypadkach użycia, takich jak rejestrowanie , obsługa obietnic , obserwowalności , routing , sprawdzanie twórców niezmienności , trwałość itp. Nie wszystkie z nich okażą się przydatne, ale miło jest mieć dostęp do zestawu narzędzi, które można łatwo połączyć, aby ze sobą współpracować.

Prostota

Redux zachowuje wszystkie zalety Flux (nagrywanie i odtwarzanie akcji, jednokierunkowy przepływ danych, zależne mutacje) i dodaje nowe korzyści (łatwe cofanie, ponawianie, ponowne ładowanie) bez konieczności wprowadzania dyspozytora i rejestracji w sklepie.

Utrzymanie prostoty jest ważne, ponieważ pozwala zachować rozsądek podczas wdrażania abstrakcyjnych poziomów wyższego poziomu.

W przeciwieństwie do większości bibliotek Flux, interfejs API Redux jest niewielki. Jeśli usuniesz ostrzeżenia programisty, komentarze i testy poprawności, będzie to 99 wierszy . Nie ma trudnego kodu asynchronicznego do debugowania.

Możesz go przeczytać i zrozumieć cały Redux.


Zobacz także moją odpowiedź na temat wad korzystania z Redux w porównaniu do Flux .


3
dzięki za odpowiedź ... Jestem nowy w js .. w twojej odpowiedzi powiedziałeś, że flux używa wzorca projektowego singleton ... czy możesz mi powiedzieć na czerwono, jakiego rodzaju wzorca projektowego używają ... i w flux może mówisz mi, gdzie używają wzoru singleton ... czy możesz podać oba przykłady ... Zrozumiałem, co oznacza wzór singleton

2
Rozpocząłem implementację Androida / Java (Fluxxan) w oparciu o Fluxxor (zasadniczo czysty flux). Kiedy zobaczyłem redux, zostałem sprzedany. Jest kilka porcji, które trzymałem czysto, ale stary, twoja lib jest niesamowita!
frostymarvelous 12.04.16

5
Chcesz nauczyć się Redux? po prostu obejrzyj ten
film

5
Wybraliśmy redux, ponieważ jest on o wiele bardziej przekonany niż flux. Ciągle walczyliśmy o to, w jaki sposób / gdzie powinien iść określony kod itp. Redux usunął dla nas całe to zamieszanie. Stworzyliśmy aplikacje z redux dla sieci i reagujące na zmiany i to niesamowite !!
Coś

1
Linia github.com/reactjs/redux/blob/… była odpowiedzią na pytanie, którego szukałem przez tydzień: jak zbudować sklep i reduktory, aby można było obsłużyć wiele instancji komponentu wielokrotnego użytku używanego w innym kontekście bez powielania logika. Odpowiedź wydaje się brzmieć: użyj trzech poziomów głębokiego przechowywania: 1. poziom: nazwa komponentu („pagination”), 2. poziom: nazwa kontenera („stargazersByRepo”), 3 poziom: unikalny klucz / identyfikator kontenera ( ${login}/${name}). Dziękuję Ci bardzo!
qbolec

101

W Quora ktoś mówi :

Przede wszystkim można całkowicie pisać aplikacje za pomocą React bez Fluxa.

Również ten schemat wizualny, który stworzyłem, aby pokazać szybki przegląd obu, prawdopodobnie szybką odpowiedź dla osób, które nie chcą przeczytać całego wyjaśnienia: Flux vs Redux

Ale jeśli nadal chcesz wiedzieć więcej, czytaj dalej.

Uważam, że powinieneś zacząć od czystej React, a następnie nauczyć się Redux i Flux. Po tym, jak będziesz mieć PRAWDZIWE doświadczenie z React, zobaczysz, czy Redux jest dla ciebie pomocny, czy nie.

Może poczujesz, że Redux jest właśnie dla twojej aplikacji, a może przekonasz się, że Redux próbuje rozwiązać problem, którego tak naprawdę nie masz.

Jeśli zaczniesz bezpośrednio od Redux, możesz skończyć z przeprojektowanym kodem, kodem trudniejszym do utrzymania i jeszcze większą liczbą błędów i niż bez Redux.

Z dokumentów Redux :

Motywacja
Ponieważ wymagania dotyczące aplikacji jednostronicowych JavaScript stają się coraz bardziej skomplikowane, nasz kod musi zarządzać większą liczbą stanów niż kiedykolwiek wcześniej. Ten stan może obejmować odpowiedzi serwera i buforowane dane, a także lokalnie utworzone dane, które nie zostały jeszcze utrwalone na serwerze. Stan interfejsu użytkownika również rośnie w złożoności, ponieważ musimy zarządzać aktywnymi trasami, wybranymi kartami, pokrętłami, kontrolkami paginacji i tak dalej.

Zarządzanie tym ciągle zmieniającym się stanem jest trudne. Jeśli model może zaktualizować inny model, widok może zaktualizować model, który zaktualizuje inny model, a to z kolei może spowodować aktualizację innego widoku. W pewnym momencie nie rozumiesz już, co dzieje się w Twojej aplikacji, ponieważ straciłeś kontrolę nad tym, kiedy, dlaczego i jaki jest jej stan. Kiedy system jest nieprzejrzysty i niedeterministyczny, trudno jest odtworzyć błędy lub dodać nowe funkcje.

Jakby to nie było dość złe, zastanów się, czy nowe wymagania stają się powszechne w rozwoju produktów front-end. Jako programiści oczekujemy optymistycznych aktualizacji, renderowania po stronie serwera, pobierania danych przed wykonaniem przejścia trasy i tak dalej. Próbujemy poradzić sobie ze złożonością, z którą nigdy wcześniej nie mieliśmy do czynienia, i nieuchronnie zadajemy pytanie: czy czas się poddać? Odpowiedź brzmi nie.

Ta złożoność jest trudna do opanowania, ponieważ mieszamy dwie koncepcje, o których ludzkim umyśle trudno jest wnioskować: mutacja i asynchroniczność. Nazywam je Mentos i Coke. Oba mogą być świetne, gdy są rozdzielone, ale razem tworzą bałagan. Biblioteki takie jak React próbują rozwiązać ten problem w warstwie widoku poprzez usunięcie zarówno asynchronicznej, jak i bezpośredniej manipulacji DOM. Jednak zarządzanie stanem Twoich danych należy do Ciebie. W tym momencie pojawia się Redux.

Podążając śladami Flux, CQRS i Event Sourcing, Redux stara się, aby mutacje stanu były przewidywalne, nakładając pewne ograniczenia na to, jak i kiedy mogą się odbywać aktualizacje. Ograniczenia te znajdują odzwierciedlenie w trzech zasadach Redux.

Również z dokumentów Redux :

Podstawowe pojęcia
Sam Redux jest bardzo prosty.

Wyobraź sobie, że stan Twojej aplikacji jest opisany jako zwykły obiekt. Na przykład stan aplikacji do zrobienia może wyglądać następująco:

{
  todos: [{
    text: 'Eat food',
    completed: true
  }, {
    text: 'Exercise',
    completed: false
  }],
  visibilityFilter: 'SHOW_COMPLETED'
}

Ten obiekt jest jak „model”, tyle że nie ma żadnych ustawień. Dzieje się tak, aby różne części kodu nie mogły dowolnie zmieniać stanu, powodując trudne do odtworzenia błędy.

Aby zmienić coś w stanie, musisz wysłać akcję. Działanie to zwykły obiekt JavaScript (zauważ, jak nie wprowadzamy żadnej magii?), Który opisuje, co się stało. Oto kilka przykładowych działań:

{ type: 'ADD_TODO', text: 'Go to swimming pool' }
{ type: 'TOGGLE_TODO', index: 1 }
{ type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_ALL' }

Wymuszenie, że każda zmiana jest opisana jako działanie, pozwala nam dokładnie zrozumieć, co dzieje się w aplikacji. Jeśli coś się zmieniło, wiemy, dlaczego to się zmieniło. Działania są jak bułka tarta tego, co się wydarzyło. Wreszcie, aby połączyć stan i działania, piszemy funkcję zwaną reduktorem. Ponownie, nic magicznego w tym - jest to tylko funkcja, która przyjmuje stan i akcję jako argumenty i zwraca następny stan aplikacji. Trudno byłoby napisać taką funkcję dla dużej aplikacji, więc piszemy mniejsze funkcje zarządzające częściami stanu:

function visibilityFilter(state = 'SHOW_ALL', action) {
  if (action.type === 'SET_VISIBILITY_FILTER') {
    return action.filter;
  } else {
    return state;
  }
}

function todos(state = [], action) {
  switch (action.type) {
  case 'ADD_TODO':
    return state.concat([{ text: action.text, completed: false }]);
  case 'TOGGLE_TODO':
    return state.map((todo, index) =>
      action.index === index ?
        { text: todo.text, completed: !todo.completed } :
        todo
   )
  default:
    return state;
  }
}

Piszemy też inny reduktor, który zarządza pełnym stanem naszej aplikacji, wywołując te dwa reduktory dla odpowiednich kluczy stanu:

function todoApp(state = {}, action) {
  return {
    todos: todos(state.todos, action),
    visibilityFilter: visibilityFilter(state.visibilityFilter, action)
  };
}

To w zasadzie cała idea Redux. Pamiętaj, że nie korzystaliśmy z żadnych interfejsów API Redux. Jest wyposażony w kilka narzędzi ułatwiających ten wzorzec, ale główna idea polega na tym, że opisujesz, jak twój stan jest aktualizowany w czasie w odpowiedzi na obiekty akcji, a 90% pisanego kodu to po prostu JavaScript, bez użycia Redux sama, jej interfejsy API lub dowolna magia.


57

Być może najlepiej zacząć od przeczytania tego posta Dan Abramov, w którym omawia różne implementacje Fluxa i ich kompromisy w czasie, gdy pisał redux: The Evolution of Flux Frameworks

Po drugie, strona motywacji, do której linkujesz, tak naprawdę nie omawia motywacji Redux, tak jak motywacji stojącej za Flux (i React). Te trzy zasady jest bardziej specyficzny Redux choć nadal nie radzić sobie z różnicami implementacji ze standardowego architektury Flux.

Zasadniczo Flux ma wiele sklepów, które obliczają zmianę stanu w odpowiedzi na interakcje interfejsu użytkownika / interfejsu API ze składnikami i rozgłaszają te zmiany jako zdarzenia, które mogą subskrybować składniki. W Redux istnieje tylko jeden sklep, który subskrybuje każdy komponent. IMO wydaje się, że przynajmniej Redux dodatkowo upraszcza i ujednolica przepływ danych poprzez ujednolicenie (lub ograniczenie, jak powiedziałby Redux) przepływu danych z powrotem do komponentów - podczas gdy Flux koncentruje się na ujednoliceniu drugiej strony przepływu danych - zobacz Model.


27

Jestem wczesnym adaptatorem i zaimplementowałem aplikację o dużej, jednostronicowej stronie, korzystając z biblioteki Facebook Flux.

Ponieważ jestem trochę spóźniony do rozmowy, po prostu podkreślę, że pomimo moich najlepszych nadziei Facebook wydaje się uważać ich wdrożenie Fluxa za dowód koncepcji i nigdy nie otrzymał uwagi, na którą zasługuje.

Zachęcam do zabawy, ponieważ odsłania on bardziej wewnętrzne działanie architektury Flux, która jest dość edukacyjna, ale jednocześnie nie zapewnia wielu korzyści, jakie zapewniają biblioteki takie jak Redux (które nie są jest to ważne w przypadku małych projektów, ale staje się bardzo cenne w przypadku większych).

Zdecydowaliśmy, że posuwając się naprzód, przejdziemy do Redux i sugeruję, abyś zrobił to samo;)


Od sześciu miesięcy rozwijam aplikację Facebook Flux. I nadal nie jestem pewien, czy czas migracji jest wart korzyści, które zapewnia Redux. Będę bardzo wdzięczny za wszelkie komentarze na temat zalet / wad Redux nad FB flux!
VB_

1
@VolodymyrBakhmatiuk w naszym przypadku chodzi przede wszystkim o zmniejszenie ilości blaszki, którą musimy napisać + lepszą obsługę błędów (redux na przykład będzie krzyczeć, jeśli uruchomisz akcję, która nie została zdefiniowana na twojej stałej liście - strumień FB nie i może to spowodować rodzaje problemów) Istnieje kilka bardziej zaawansowanych możliwości, ale jeszcze ich nie użyłem
Guy Nesher

1
@GuyNesher niezdefiniowane działanie powinno zostać wykryte w czasie kompilacji, a nie w czasie wykonywania. Flow (kolejny wkład Facebooka) pozwala ci to zrobić.
Dominique PERETTI

@DominiquePERETTI - prawda (może również używać szorowania), ale nie zmienia to faktu, że nie wyłapanie błędu w czasie wykonywania jest trochę smutne
Guy Nesher

Napisałem kilka prostych pomocników do radzenia sobie z FBFlux, i faktycznie wydaje się, że jest mniej konfigurowalny i skonfigurowany niż wszystkie przykładowe aplikacje Redux, które znalazłem. Pracowałem nad aplikacją przez ponad 9 miesięcy między dwoma deweloperami i nigdy nie miałem żadnych problemów z architekturą.
rob2d

20

Oto proste wyjaśnienie Redux nad Flux. Redux nie ma dyspozytora, opiera się na czystych funkcjach zwanych reduktorami. Nie potrzebuje dyspozytora. Każda akcja jest obsługiwana przez jeden lub więcej reduktorów w celu aktualizacji pojedynczego sklepu. Ponieważ dane są niezmienne, reduktory zwracają nowy zaktualizowany stan, który aktualizuje sklepwprowadź opis zdjęcia tutaj

Aby uzyskać więcej informacji Flux vs Redux


O wielu sklepach, teraz jest coś wykonalnego w Redux, w React-Redux możesz dodać klucz do izolowania sklepów: redux.js.org/faq/storesetup działająca próbka: github.com/Lemoncode/redux-multiple-stores
Braulio

6

Długo pracowałem z Flux, a teraz dość długo z Redux. Jak zauważył Dan, obie architektury nie różnią się tak bardzo. Chodzi o to, że Redux czyni rzeczy prostszymi i czystszymi. Nauczy Cię kilku rzeczy na temat Fluxa. Jak na przykład Flux jest doskonałym przykładem jednokierunkowego przepływu danych. Rozdzielenie obaw, w których mamy dane, ich manipulacje i warstwę widoku oddzielone. W Redux mamy te same rzeczy, ale uczymy się również o niezmienności i czystych funkcjach.


5

Z nowego modułu adoptującego reakcję / redux migrującego z (kilku lat) ExtJS w połowie 2018 r .:

Po zjechaniu do tyłu w dół krzywej uczenia się redux, miałem to samo pytanie i pomyślałem, że czysty strumień będzie prostszy jak OP.

Wkrótce zobaczyłem zalety redux nad flux, jak zauważono w odpowiedziach powyżej, i pracowałem nad tym w mojej pierwszej aplikacji.

Znów chwytając płytę kotła, wypróbowałem kilka innych bibliotek zarządzania stanem, najlepiej znalazłem rewanż .

Było o wiele bardziej intuicyjne niż redux waniliowy, odcina 90% płyty głównej i 75% czasu, który spędziłem na redux (coś, co myślę, że biblioteka powinna robić), udało mi się zdobyć kilka aplikacji dla przedsiębiorstw idę od razu.

Działa również z tym samym narzędziem redux. To dobry artykuł, który obejmuje niektóre korzyści.

Tak więc dla każdego, kto przybył do tego wpisu SO szukając „prostszego redux”, polecam wypróbowanie go jako prostej alternatywy dla redux ze wszystkimi zaletami i 1/4 płyty głównej.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.