Не уверен, потому что я не вижу форму вашего byId
объекта, но я думаю, что проблема может быть здесь:
case POST_COMMENT_SUCCESS:
return {
...state, // here you are spreading the whole state object
// and here you are spreading state.comments at the same level, NOT nested:
...state.comments,
// Again same thing here, not nested:
[action.data.id]: action.data,
}
Вместо этого вы должны делать что-то вроде этого, больше информации в Redux docs :
case POST_COMMENT_SUCCESS:
return {
...state,
comments: {
...state.comments,
[action.data.id]: action.data
}
}
В качестве альтернативы, вы можете использовать Immer , чтобы упростить ваши редукторы, я использую его, и мне это нравится. Это немного странно, потому что вы можете использовать методы мутации, чтобы изменить draft
, но было бы здорово, если вы хотите иметь более простые редукторы. Ваш код с Immer был бы намного проще:
case POST_COMMENT_SUCCESS:
draft.comments[action.data.id]: action.data,
return;
С Immer вам просто нужно изменить (или изменить) объект draft
, если значение, которое вы назначаете, отличается от того, которое выИмея в состоянии, он сгенерирует для вас новый объект, в противном случае он вернет состояние.
Надеюсь, это поможет.