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 ]
},
}
当然,这会分成三个可组合的缩减器(filter
,allThingsList
和entities
),但在我看来,我想为{{1}编写单独的缩减器}和entities.cards
。
有没有办法将实体管理拆分为允许这样组合的子推导者:
entities.categories
将let rootReducer = combineReducers({
entities: {
things,
categories
},
filter,
allCardsList
});
和cards
保留在categories
中是否有任何好处,而不是保持根级别(允许使用entities
进行合成)?
combineReducers
答案 0 :(得分:8)
有没有办法将实体管理分成允许这样的组合的子减少器?
当然! combineReducers()
只是给你一个减速器,所以你可以多次使用它:
let rootReducer = combineReducers({
entities: combineReducers({
things,
categories
}),
filter,
allCardsList
});
shopping-cart example in Redux repo演示了这种方法。
将卡和类别保留在实体中是否有任何优势,而不是保持在根级别?
这取决于你,但我发现你建议的结构更容易使用。理解在单个键下对所有实体进行分组确实更容易,如上所示,可以使用combineReducers()
。