2017-07-01 102 views
0

嘿傢伙,所以我有一個獨特的使用案例,我想重寫從reducer的整個應用程序狀態樹從reducer從combineReducer之一。目的是我想能夠加載應用程序的不同會話(有點像保存按鈕)。覆蓋狀態樹的反應減少

然而,我不知道如何去做這件事,我可以很容易地從getState獲取整個狀態並存儲它,但似乎沒有設置它。我也嘗試過查看redux-persist,但我不太確定如何將persist對象傳遞給不同的組件。

任何提示或線索?謝謝

回答

3

您可以使用Higher Order Reducer替換整個應用程序的狀態。

Higher Order Reducer

請參閱此鏈接。

如果您有任何疑問,請在評論中提問。

const {combineReducers, createStore} = require('redux'); 

function todos(state=[], action){ 
    switch (action.type) { 
     case 'ADD_TODO': 
      return [...state, action.data]; 
     default: 
      return state; 
    } 
} 

var state = { 
    todos: ['todo1'] 
} 

var reducers = combineReducers({ 
    todos: todos 
}); 

var store = createStore(HigherOrderReducer(reducers), state); 

function HigherOrderReducer(reducers, initialState){ 
    let higherState = { 
     state: initialState 
    } 
    return function(state = {}, action){ 
     switch (action.type) { 
      case 'REPLACE_WHOLE_STATE': 
       higherState.state = action.data; 
       return higherState.state; 
      default: 
       return reducers(state, action); 
     } 
    } 
} 

store.subscribe(function(){ 
    console.log(store.getState()); 
}) 

store.dispatch({ 
    type: 'ADD_TODO', 
    data: 'todo2' 
}) 

var newState = { 
    todos: ['task1', 'task2'] 
} 

store.dispatch({ 
    type: 'REPLACE_WHOLE_STATE', 
    data: newState 
}) 
+0

現在我正在使用combineReducer和每個單獨的減速器控制狀態的不同部分。但不知道如何讓減速器B也改變減速器A正在改變的狀態。 – Leon

+0

我只是在我的答案中添加示例。如果你對示例有任何dobuts,請在評論中提問。 – Vasi

+0

它的工作與否? – Vasi

1

你應該能夠替換reducer本身的整個狀態。所以,而不是像object.assign({}, state, {...})那樣做,你只需return newState

如果您要做的是從根級別還原器級別完全替換狀態,則可以基於組合狀態編寫條件。

combineReducer(AReducer, BReducer, (CReducer.someCondition? CReducer : DReducer)) 

這一切都只是JavaScript。所有這些的一個替代方法是使用reduce-redurs來合併並生成一個新的狀態(無論您選擇哪個級別(root reducer或reducer))。

+0

嗯,我不完全理解它將如何工作。 在我的應用程序中,我有AReducer和BReducer對應於應用程序的不同部分,根據我的理解,它們控制這些組件的狀態樹。 因此,我必須在每個想要更改的狀態上使用該三元CReducer.someCondition? – Leon

+0

是的。我的例子的想法是,你會用它來顯示一個CReducer或DReducer基於CReducer中的某種狀態。您可以多次使用相同的一般算法,但可能會變得笨重。我會推薦使用聯合收割機並減少減速器,使其不那麼笨重。這樣的解決方案將很大程度上取決於您的具體情況。 – Louis