В исходном состоянии у вас есть kitchen
объект внутри calculatedUsage
объекта.Но в вашем setState
вызове у вас есть kitchen
объект вне из calculatedUsage
.
Кроме того, когда вы получаете доступ к предыдущему состоянию в setState
, лучше всегоиспользуйте функциональную версию setState
, например:
componentDidMount() {
this.setState(
prevState => ({
caclulatedUsage: {
...prevState.caclulatedUsage,
bath: 12,
kitchen: {
...prevState.caclulatedUsage.kitchen,
stove: 14,
fridge: 23,
dishwasher: 34
}
}
}),
() => {
console.log(this.state);
}
);
}
Причина этого заключается в том, что setState
может быть асинхронным, что означает, что доступ к this.state
внутри него может не дать ожидаемого значения,Использование функциональной версии для изменений состояния транзакции гарантирует стабильные результаты.
Вы также можете взглянуть на библиотеку immer .Это значительно упрощает обновление глубоко вложенного состояния, позволяя выполнять неизменяемые обновления с изменяемым API.Вот пример вашего кода codeandbox, который использует immer: https://codesandbox.io/s/180p7p0o84