你可以使用combineReducers来组成深度缩减器吗?

时间:2016-04-01 17:23:31

标签: redux

Redux文档建议使用normalizr来设计状态的形状,如下所示:

{
  entities: {
    cards: {
      42: {
        id: 42,
        text: 'Hello',
        category: 2
      },
      43: {
        id: 53,
        text: 'There?',
        category: 1
      },
    }
    categories: {
      1: {
        id: 1,
        name: 'Questions'
      }
      2: {
        id: 2,
        name: 'Greetings'
      },
    }
  },
  filter: 'SHOW_ALL',
  allCardsList: {
    isFetching: false,
    items: [ 42, 43 ]
  },
}

当然,这会分成三个可组合的缩减器(filterallThingsListentities),但在我看来,我想为{{1}编写单独的缩减器}和entities.cards

有没有办法将实体管理拆分为允许这样组合的子推导者:

entities.categories

let rootReducer = combineReducers({ entities: { things, categories }, filter, allCardsList }); cards保留在categories中是否有任何好处,而不是保持根级别(允许使用entities进行合成)?

combineReducers

1 个答案:

答案 0 :(得分:8)

  

有没有办法将实体管理分成允许这样的组合的子减少器?

当然! combineReducers()只是给你一个减速器,所以你可以多次使用它:

let rootReducer = combineReducers({
   entities: combineReducers({
      things,
      categories
   }),
   filter,
   allCardsList
});

shopping-cart example in Redux repo演示了这种方法。

  

将卡和类别保留在实体中是否有任何优势,而不是保持在根级别?

这取决于你,但我发现你建议的结构更容易使用。理解在单个键下对所有实体进行分组确实更容易,如上所示,可以使用combineReducers()