嘿傢伙,所以我有一個獨特的使用案例,我想重寫從reducer的整個應用程序狀態樹從reducer從combineReducer之一。目的是我想能夠加載應用程序的不同會話(有點像保存按鈕)。覆蓋狀態樹的反應減少
然而,我不知道如何去做這件事,我可以很容易地從getState獲取整個狀態並存儲它,但似乎沒有設置它。我也嘗試過查看redux-persist,但我不太確定如何將persist對象傳遞給不同的組件。
任何提示或線索?謝謝
嘿傢伙,所以我有一個獨特的使用案例,我想重寫從reducer的整個應用程序狀態樹從reducer從combineReducer之一。目的是我想能夠加載應用程序的不同會話(有點像保存按鈕)。覆蓋狀態樹的反應減少
然而,我不知道如何去做這件事,我可以很容易地從getState獲取整個狀態並存儲它,但似乎沒有設置它。我也嘗試過查看redux-persist,但我不太確定如何將persist對象傳遞給不同的組件。
任何提示或線索?謝謝
您可以使用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
})
你應該能夠替換reducer本身的整個狀態。所以,而不是像object.assign({}, state, {...})
那樣做,你只需return newState
。
如果您要做的是從根級別還原器級別完全替換狀態,則可以基於組合狀態編寫條件。
combineReducer(AReducer, BReducer, (CReducer.someCondition? CReducer : DReducer))
這一切都只是JavaScript。所有這些的一個替代方法是使用reduce-redurs來合併並生成一個新的狀態(無論您選擇哪個級別(root reducer或reducer))。
現在我正在使用combineReducer和每個單獨的減速器控制狀態的不同部分。但不知道如何讓減速器B也改變減速器A正在改變的狀態。 – Leon
我只是在我的答案中添加示例。如果你對示例有任何dobuts,請在評論中提問。 – Vasi
它的工作與否? – Vasi