2015-12-22 14 views
5

Buduję izomorficzną aplikację z podziałem kodu za pomocą routera reagującego i redux. Posunąłem się tak daleko, jak tylko mogę, ale potrzebuję pomocy, aby dojść do końca mojego problemu. Mam dużą aplikację, która wymaga podziału kodu dla interfejsu użytkownika. Posiadam rejestr reduktora, który pozwala mi rejestrować nowe reduktory (leniwy załadowany) lub wymienić istniejące reduktory w moim sklepie. Działa to świetnie, jednak ponieważ sekcje mojej aplikacji są leniwy załadowany, moje leniwy załadowany reduktory nie są obecne, gdy wywołuję CombineReducers() po stronie klienta, podczas gdy doskonale rozwiązują się na serwerze. Powoduje to nieoczekiwany błąd klawiszy i zmusza mój sklep do zignorowania błędnego klucza (-ów) w moim początkowym stanie.Isomorphic Redux z podziałami kodu i leniwymi ładowanymi reduktorami

initialState (z serwera)

{ "cases": {...}, "user": {...} } 

stronie klienta Redux spodziewać initialState

ta opiera się na dostępnych reduktorów

{ "user": {...} } 

Loaded Reduktor

  • UserReducer

Lazy Loaded Reducer

  • CaseReducer

Błąd występuje, gdy zgłoszę następujące

const finalCreateStore = compose(
    applyMiddleware(promiseMiddleware) 
)(createStore); 
const rootReducer = combineReducers({...reducers}) 
const store = finalCreateStore(rootReducer, initialState); 

Nieoczekiwany klucz "case" znaleziony w argumencie initialState przekazanym do createStore. Oczekiwano znalezienia jednego ze znanych kluczy reduktora zamiast: "użytkownik". Nieoczekiwane klucze zostaną zignorowane.

Wszystko działa dobrze na serwerze, ale inicjowanie aplikacji na kliencie przy jednoczesnym braku reduktora, dopóki nie zostanie załadowany, powoduje ten błąd. Czy ktoś wie, jak obejść ten błąd, lub powiedzieć redux, aby nie potwierdzić kształtu stanu początkowego? Potrzebuję, żeby "przypadki" były dostępne dla mojego leniwego załadowanego reduktora.

Odpowiedz

4

Wygląda na to, że nie należy używać wbudowanego combineReducers, ponieważ wiadomo, że ostrzeżenie nie ma zastosowania. Od przewodnika Redux:

Te dwa sposoby zapisu połączoną reduktor są całkowicie równoważne:

const reducer = combineReducers({ 
    a: doSomethingWithA, 
    b: processB, 
    c: c 
}) 

function reducer(state, action) { 
    return { 
    a: doSomethingWithA(state.a, action), 
    b: processB(state.b, action), 
    c: c(state.c, action) 
    } 
} 

Więc równie dobrze może iść z drugiej opcji.

Powiązane problemy