У меня есть следующий объект, из которого я хочу удалить один комментарий.React-Redux обновляет состояние неизменяемого объекта с вложенным массивом, удаляет элемент из массива
msgComments = {
comments: [
{ comment:"2",
id:"0b363677-a291-4e5c-8269-b7d760394939",
postId:"e93863eb-aa62-452d-bf38-5514d72aff39" },
{ comment:"1",
id:"e88f009e-713d-4748-b8e8-69d79698f072",
postId:"e93863eb-aa62-452d-bf38-5514d72aff39" }
],
email:"[email protected]",
id:"e93863eb-aa62-452d-bf38-5514d72aff39",
post:"test",
title:"test"
}
Создатель действие попадает в апи функция удаления с CommentID:
// DELETE COMMENT FROM POST
export function deleteComment(commentId) {
return function(dispatch) {
axios.post(`${API_URL}/datacommentdelete`, {
commentId
},{
headers: { authorization: localStorage.getItem('token') }
})
.then(result => {
dispatch({
type: DELETE_COMMENT,
payload: commentId
});
})
}
}
Мой апи удаляет комментарий и я посылаю идентификатор комментария к моему Reducer, это работает отлично в этой точке, апи работы и комментарии удаляются. Проблема заключается в обновлении состояния в редукторе. После долгих проб и ошибок на данный момент я пытаюсь это сделать.
case DELETE_COMMENT:
console.log('State In', state.msgComments);
const msgCommentsOne = state.msgComments;
const msgCommentsTwo = state.msgComments;
const deleteIndexComment = state.msgComments.data.comments
.findIndex(elem => elem.id === action.payload);
const newComments = [
...msgCommentsTwo.data.comments.slice(0, deleteIndexComment),
...msgCommentsTwo.data.comments.slice(deleteIndexComment + 1)
];
msgCommentsOne.data.comments = newComments;
console.log('State Out', msgCommentsOne);
return {...state, msgComments: msgCommentsOne};
Оба состояния в состоянии AND имеют один и тот же объект, у которого есть комментарий, удаленный, который я нахожу загадочным.
Также компонент не обновляется (когда я обновить комментарий исчез, как новый апи сделан вызов, чтобы вернуть обновленный пост.
Все остальное, кажется, работает нормально, проблема, как представляется, в редукторе .
Я прочитал другие сообщения об неизменяемости, которые были релевантными, и я по-прежнему не в состоянии решить проблему. Я также исследовал и нашел библиотеку immutability.js, но прежде чем я узнаю, как использовать это, я хотел найти решение (возможно, трудно, но я хочу понять, как это работает!).
И поэтому предложенный подход к структурированию хранилища Redux заключается в том, чтобы сохранить ваше состояние более плоским и нормализованным :) FYI. В настоящее время я работаю над новым набором страниц для документов Redux, описывающих, как писать логику редуктора, и обработка нормализованных данных является частью этого. Описание задачи находится на странице https://github.com/reactjs/redux/issues/1784, и у нее есть ссылка на страницы WIP.Вам может быть интересно прочитать их. – markerikson
Да, работа вокруг может быть на самом апи – alexi2