In some situations, I want to validate data in a React application by comparing the current state with the original data obtained from the API. I have issues preserving the original data when I need to modify a nested element inside an array.
For example, with this data:
{
id: 1,
items: [{name: "foo"}, {name: "bar"}]
}
And the following React component excerpt:
constructor(props) {
super(props);
this.state = {
originalData: null,
items: [],
};
}
componentDidMount() {
Api.get("/data").then(res => {
this.setState({
originalData: res.data,
items: res.data.items,
}
});
}
If this.state.items[0]
becomes {name: "baz"}
, this.state.originalData.items[0]
will also be modified. I tried to use res.data.items.slice()
and [...res.data.items]
to make a copy of the array when setting the this.state.items
but it did not help.
The two solutions I can see are:
- Call the API to get the original data when it's time to validate the current state
- Use
JSON.parse(JSON.stringify(res.data))
to store a new object not referencingres.data
insidethis.state.originalData
.
Is there a more elegant solution?