在react redux中覆盖状态树

时间:2017-07-01 01:34:30

标签: javascript reactjs redux

嘿伙计,所以我有一个独特的用例,我想从combineReducer中的一个reducer覆盖redux中的整个app状态树。目的是我希望能够加载应用程序的不同会话(有点像保存按钮)。

但是我不知道如何解决这个问题,我可以轻松地从getState获取整个状态并存储它,但似乎没有设置它。我也尝试过研究redux-persist,但我不太确定如何将persister对象传递给不同的组件。

任何提示或线索?感谢

2 个答案:

答案 0 :(得分:4)

您可以使用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
})

答案 1 :(得分:1)

您应该能够在reducer本身中替换整个状态。所以,不要像object.assign({}, state, {...})这样做,而只需要return newState

如果你要做的是从root-reducer级别完全替换状态,你可以根据组合状态编写一个条件。

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

它只是javascript。所有这一切的替代方法是使用reduce-reducers来合并并在您选择的任何级别(根减速器或减速器)生成新状态。