Javascript 在react redux中覆盖状态树

Javascript 在react redux中覆盖状态树,javascript,reactjs,redux,Javascript,Reactjs,Redux,嘿,伙计们,我有一个独特的用例,我想从combineReducer的一个还原器重写redux中的整个应用程序状态树。目的是我希望能够加载应用程序的不同会话(有点像保存按钮) 但是我不知道如何处理这个问题,我可以很容易地从getState获取整个状态并存储它,但是似乎没有一个可以设置它。我也尝试过研究redux persist,但我不太确定如何将persister对象传递给不同的组件 有什么提示或线索吗?谢谢您应该能够更换减速器本身的整个状态。因此,与其执行类似于object.assign({},

嘿,伙计们,我有一个独特的用例,我想从combineReducer的一个还原器重写redux中的整个应用程序状态树。目的是我希望能够加载应用程序的不同会话(有点像保存按钮)

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


有什么提示或线索吗?谢谢

您应该能够更换减速器本身的整个状态。因此,与其执行类似于
object.assign({},state,{…})
的操作,不如
返回newState

如果您试图完全替换根还原器级别的状态,则可以基于组合状态编写一个条件

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

都是javascript。所有这些的替代方法是使用reduce reducer在您选择的任何级别(根reducer或reducer)合并并生成新状态。

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

嗯,我不完全理解这一切是如何运作的。在我的应用程序中,我有一个减速机和一个减速机对应于应用程序的不同部分,据我所知,它们控制着这些组件的状态树。所以我必须使用三元CReducer。每个状态下我想要改变的条件?是的。不过,我的示例的想法是,您可以使用它来显示基于CReducer中某个状态的CReducer或DReducer。您可以多次使用相同的通用算法,但它可能会变得笨重。我建议使用组合减速机和减速机,使其不那么笨重。这样的解决方案在很大程度上取决于您的具体情况。现在我使用combineReducer,每个单独的减速机控制着州的不同部分。但我不确定如何让减速器B也改变减速器A正在改变的状态。我只是在回答中添加了一个例子。如果你有任何关于例子的建议,请在评论中提问。是的,工作很有魅力,不得不改变一些东西,但这是意料之中的。谢谢!问题:为什么需要的
higherState
变量?