Я пытаюсь обновить значение, хранящееся в глубоко вложенном объекте.Он содержит много информации и схема является фиксированной.Я пытаюсь скопировать объект, а затем вернуть объект со значением обновления onChange из входа.Однако я не могу успешно правильно скопировать полное дерево и вернуть обновленный контент.
DEMO : https://codesandbox.io/s/4j7x8jlk9w
объект выглядит так:
content: {
label: "Label",
templates: [
{
name: "example",
type: "the type",
items: [
{
key: "key1",
properties: {
text: {
label: "The Label 1",
value: "The Value 1"
},
color: {
label: "Color",
value: "#123"
}
}
},
{
key: "key2",
properties: {
text: {
label: "The Label 2",
value: "The Value 2"
},
color: {
label: "Color",
value: "#456"
}
}
}
]
}
]
}
Редуктор:
case "UPDATE_VALUE":
const content = state.content.templates[state.templateKey].items[
state.itemKey
].properties.text.value =
action.value;
return { ...state, content };
default:
return state;
}
Компонент:
import React, { PureComponent } from "react";
import { connect } from "react-redux";
import { updateValue } from "./actions";
class Page extends PureComponent {
render() {
const { content, templateKey, itemKey } = this.props;
return (
<div>
<h1
style={{
color:
content.templates[templateKey].items[itemKey].properties.color
.value
}}
>
{content.templates[templateKey].items[itemKey].properties.text.value}
</h1>
<input
name={content.templates[templateKey].items[itemKey].key}
value={
content.templates[templateKey].items[itemKey].properties.text.value
}
onChange={e => this.props.updateValue(e.target.name, e.target.value)}
/>
</div>
);
}
}
const mapStateToProps = state => ({
content: state.content,
templateKey: state.templateKey,
itemKey: state.itemKey
});
const mapDispatchToProps = dispatch => ({
updateValue: (key, value) => dispatch(updateValue(key, value))
});
export default connect(
mapStateToProps,
mapDispatchToProps
)(Page);