Redux documentation提供了一个存储帖子和评论的存储示例。为了减少嵌套对象的复杂性,建议将注释保留为ID数组。
因此,posts reducer的代码将如下所示:
function postsById(state = {}, action) {
switch (action.type) {
case 'ADD_COMMENT':
var { commentId, postId, commentText } = action.payload;
var post = state[postId];
return {
...state,
[postId]: {
...post,
comments: post.comments.concat(commentId)
}
}
default:
return state
}
}
但是为什么不将整个对象保留在那里?
...
return {
...state,
[postId]: {
...post,
comments: post.comments.concat(
{commentId, commentText} // <=
)
}
}
...
如果这样做,则无需使用复杂的选择器和计算来获取所需的数据:
// keeping IDs
function getPostComments(state, postId) {
return state.postsById[postId].comments.map(
commentId => state.commentsById[commentId]
)
}
// keeping objects
function getPostComments(state, postId) {
return state.postsById[postId].comments
}
尽管此示例非常简单,但在其他情况下,保留整个对象将使复杂的选择器更加容易。