Idę migrować do Redux.
Moja aplikacja składa się z wielu części (stron, komponentów), dlatego chcę stworzyć wiele reduktorów. Przykłady Redux pokazują, że powinienem użyć combineReducers()
do wygenerowania jednego reduktora.
Rozumiem również, że aplikacja Redux powinna mieć jeden sklep i jest tworzona po uruchomieniu aplikacji. Kiedy tworzony jest sklep, powinienem przekazać mój połączony reduktor. Ma to sens, jeśli aplikacja nie jest zbyt duża.
Ale co jeśli zbuduję więcej niż jeden pakiet JavaScript? Na przykład każda strona aplikacji ma własny pakiet. Myślę, że w tym przypadku jeden połączony reduktor nie jest dobry. Przejrzałem źródła Redux i znalazłem replaceReducer()
funkcję. Wydaje się, że tego chcę.
Mógłbym stworzyć połączony reduktor dla każdej części mojej aplikacji i używać jej, replaceReducer()
gdy przechodzę między częściami aplikacji.
Czy to dobre podejście?
źródło
/homepage
a następnie więcej tej gałęzi jest ładowanych, gdy użytkownik przechodzi do swojegoprofile.
przykładu. zrobienie tego byłoby niesamowite. W przeciwnym razie trudno mi spłaszczyć moje drzewo stanu lub muszę mieć bardzo specyficzne nazwy gałęziuser-permissions
iuser-personal
W ten sposób zaimplementowałem go w bieżącej aplikacji (na podstawie kodu Dana z problemu GitHub!)
Utwórz instancję rejestru podczas ładowania aplikacji, przekazując reduktory, które zostaną zawarte w pakiecie wejściowym:
Następnie podczas konfigurowania sklepu i tras użyj funkcji, którą możesz nadać rejestrowi reduktora:
Gdzie te funkcje wyglądają mniej więcej tak:
Oto podstawowy przykład na żywo, który został stworzony przy użyciu tej konfiguracji i jego źródła:
Obejmuje również niezbędną konfigurację, aby umożliwić ponowne ładowanie na gorąco wszystkich reduktorów.
źródło
Jest teraz moduł, który dodaje wtryskowe reduktory do sklepu redux. Nazywa się to Redux Injector .
Oto jak z niego korzystać:
Nie łącz reduktorów. Zamiast tego umieść je w (zagnieżdżonym) obiekcie funkcji, tak jak normalnie, ale bez ich łączenia.
Użyj createInjectStore z redux-injector zamiast createStore z redux.
Wprowadzaj nowe reduktory za pomocą injectReducer.
Oto przykład:
Pełne ujawnienie: Jestem twórcą modułu.
źródło
Od października 2017 r .:
Reedux
wdraża to, co zasugerował Dan i nic więcej, nie dotykając sklepu, projektu ani nawyków
Są też inne biblioteki, ale mogą mieć zbyt wiele zależności, mniej przykładów, skomplikowane użycie, są niekompatybilne z niektórymi programami pośrednimi lub wymagają przepisania zarządzania stanem. Skopiowano ze strony wprowadzającej Reedux:
źródło
Wydaliśmy nową bibliotekę, która pomaga modulować aplikację Redux i umożliwia dynamiczne dodawanie / usuwanie reduktorów i oprogramowania pośredniego.
Proszę spojrzeć na https://github.com/Microsoft/redux-dynamic-modules
Moduły zapewniają następujące korzyści:
Moduły można łatwo ponownie wykorzystać w aplikacji lub między wieloma podobnymi aplikacjami.
Komponenty deklarują moduły, których potrzebują, a moduły redux-dynamic zapewniają, że moduł zostanie załadowany dla komponentu.
cechy
Przykładowe scenariusze
źródło
Oto kolejny przykład podziału kodu i sklepów redux, moim zdaniem dość prosty i elegancki. Myślę, że może to być przydatne dla tych, którzy szukają działającego rozwiązania.
Ten sklep jest nieco uproszczony, nie zmusza cię do posiadania przestrzeni nazw (reder.name) w obiekcie stanu, oczywiście może wystąpić kolizja z nazwami, ale możesz to kontrolować, tworząc konwencję nazewnictwa dla swoich reduktorów i to powinno być dobrze.
źródło