У меня имеется такая вложенность в редьюсере
initialState = {
prop1: {
props2: {
prop3: {id: '123', text: '222'},
prop4: {id: '321', text: '555}
}
}
}
Мне нужно при срабатывании экшена на добавление задачи получить следующее
initialState = {
prop1: {
props2: {
prop3: {id: '123', text: '222'},
prop4: {id: '321', text: '555'},
newprop: {id: '555', text: 'dasdadasd'}
}
}
}
Как это можно реализовать? Как бы я не пытался у меня постоянно перетирается существующий объект новым свойством, попытка задать новое свойство провалилась, причем свойство по сути у меня совпадает с ID которое будет в объекте, т.к. его я передаю через action.payload[0]
Стандартными средствами, без зависимостей:
return Object.assign({}, state, {
prop1: {
...state.prop1,
props2: {
...state.prop1.props2,
newprop: { id: '555', text: 'dasdadasd' }
}
}
});
Для того чтобы избежать копирования вложенных структур по референсу, нужно деструктурировать все объектные свойства объекта стейта, по всем уровням вложенности.
Я не совсем понял где именно в action.payload лежит объектное значение нового свойства, поэтому в примере написал это значение литералом вместо клонирования (вида { ...action.payload.data }).
В том случае, если у значения нового свойства тоже будет вложенность - нужно глубоко клонировать его тем же способом, как в примере клонируется стейт.
Для сильно сложных/объемных структур, советую использовать глубокое клонирование средствами сторонней библиотеки, например Lodash.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости