Документация Redux дает пример хранилища, в котором хранятся сообщения и комментарии.Чтобы уменьшить сложность вложенных объектов, предлагается сохранить комментарии в виде массива идентификаторов.
Таким образом, код редуктора сообщений будет выглядеть так:
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
}
Хотя этот пример оченьпросто, в других случаях сохранение целых объектов значительно облегчит сложные селекторы.