Redux 组合传感器和状态的形状

Redux 组合传感器和状态的形状,redux,Redux,在本报告中,声明: 典型应用程序的状态形状大致如下: 或 现在我使用的是combinereducer,我需要知道如何实现这种结构 考虑到combineReducers的行为,即在状态下为传递给combineReducers的每个减速器设置相应的键 我是否必须为domainData1、domainData2、appState1、appState2和ui创建一个缩减器? 或者有其他方法来定义这样的状态形状? 是否可以禁用组合减速器将每个减速器的键添加到状态的行为 combinereducer获取一个

在本报告中,声明:

典型应用程序的状态形状大致如下:

现在我使用的是
combinereducer
,我需要知道如何实现这种结构 考虑到
combineReducers
的行为,即在状态下为传递给
combineReducers
的每个减速器设置相应的键

我是否必须为domainData1、domainData2、appState1、appState2和ui创建一个缩减器? 或者有其他方法来定义这样的状态形状? 是否可以禁用组合减速器将每个减速器的键添加到状态的行为

combinereducer
获取一个对象,该对象中充满了切片缩减器函数,并且 创建一个函数,该函数使用 同样的钥匙

这是联合收割机减速器的定义

我是否必须为domainData1、domainData2、appState1、appState2和ui创建一个缩减器?

是,为每一个定义减速器,并为每一个定义减速器。 比如: { domainData1:domainData1Reducer, domainData2:domainData2Reducer, appState1:appState1Reducer, appState2:appState1Reducer,, ui:uiReducer

}

是否可以禁用组合减速器将每个减速器的键添加到状态的行为

不,用联合收割机减速机你不能。但是您可以为此编写实现

或者有另一种方法来定义这样的状态形状? 是的,我们也可以在单减速器中进行此操作。如果您愿意。

这就是我所做的:

// don't provide keys to reducers that don't supply them
const filterReducer = (reducer) => {
  let lastState = undefined;
  return (state, action) => {
    if (lastState === undefined || state == undefined) {
      lastState = reducer(state, action);
      return lastState;
    }
    var filteredState = {};
    Object.keys(lastState).forEach( (key) => {
      filteredState[key] = state[key];
    });
    var newState = reducer(filteredState, action);
    lastState = newState;
    return newState;
  };
}
首先,我创建了
simpleDomainData1
simpleDomainData2
entityType1
entityType2
,以及
uiSection1
uiSection2

然后我将entityType1和entityType2组合如下:

const entities = combineReducers({
    entityType1,
    entityType2,
});

const ui = combineReducers({
  uiSection1,
  uiSection2,
})
 { 
    simpleDomainData1: {....}, 
    simpleDomainData2: {....}, 
    entities : { 
        entityType1 : {....}, 
        entityType2 : {....} 
    },
    ui : { 
        uiSection1 : {....}, 
        uiSection2 : {....}, 
    }
}
或者,您可以创建自己的combineReducers函数并使用该函数:

const entities = (state, action) => {
    entityType1: entityType1(state.entityType1),
    entityType2: entityType2(state.entityType2)
}

const ui = (state, action) => {
    uiSection1: uiSection1(state.uiSection1),
    uiSection2: uiSection2(state.uiSection2)
}
在那之后:

const allReducers = combineReducers({
    simpleDomainData1,
    simpleDomainData2,
    entities,
    ui    
});
现在,状态形状将如下所示:

const entities = combineReducers({
    entityType1,
    entityType2,
});

const ui = combineReducers({
  uiSection1,
  uiSection2,
})
 { 
    simpleDomainData1: {....}, 
    simpleDomainData2: {....}, 
    entities : { 
        entityType1 : {....}, 
        entityType2 : {....} 
    },
    ui : { 
        uiSection1 : {....}, 
        uiSection2 : {....}, 
    }
}

你能提供一个你想做什么的例子吗,更具体地说?您可以使用和不使用
combinereducer
来实现此状态对象,因此您的要求有点混乱。我想这样构造我的应用程序的状态:{simpleDomainData1:{…},simpleDomainData2:{…}实体:{entityType1:{…},entityType2:{…}UI:{uiSection1:{…},uiSection2:{…}是的,但哪一个是减速器?您可以将每个reducer视为一个状态对象,因此,
combinereducer
允许您将它们组合在一个名称下,您可以选择这个名称。