Hi guys I have a problem and from start I will mention that I already tried thisand this
My situation is as follows. I have API, that sends me
Root is in the component state!
Root: {
RootVal1: {
Prop1: '',
Prop2: '',
Prop3: '',
}
RootVal2: [
PropObj1: {
NestedProp1: '',
NestesPropObj: {
NestedEvenMoreProp1: '',
NestedEvenMoreProp2: '',
NestedEvenMoreProp3: ''
}
},
PropObj2: {
NestedProp1: '',
NestesPropObj: {
NestedEvenMoreProp1: '',
NestedEvenMoreProp2: '',
NestedEvenMoreProp3: ''
}
},
PropObj3: {
NestedProp1: '',
NestesPropObj: {
NestedEvenMoreProp1: '',
NestedEvenMoreProp2: '',
NestedEvenMoreProp3: ''
}
},
]
}
How can I update Prop1
, Prop2
, Prop3
, NestedEvenMoreProp1
, NestedEvenMoreProp2
, NestedEvenMoreProp3
with setState
?
The last constraint is that I cannot change the name of root(i cannot rename it to newRoot etc.)
What I have tried is to call this function:
/**
* @summary update state using immutable object
* @param {Object} name of key and value for update
* @returns {string} Promise that returns
*/
updateStateHelper = target => new Promise((resolve) => {
const updatedState =
update(this.state[target.name], { $merge: { [target.name]: target.value } });
this.setState(prevState => ({
...prevState,
updatedState,
}), () => resolve(this.state[target.name]));
});
As so:
// data[0] and data[1] is just copy of RootVal2 and RootVal1, with changed values.
data[0]
data[1]
const root = Object.assign({}, this.state.root);
root.RootVal2 = [...data[0].RootVal2];
root.RootVal1 = {...data[1]};
//Here root displays edited
console.log(root);
this.updateStateHelper({name: 'root', value: root,})
.then(() => {
//Here root displays without the edit
console.log(this.state.root);
resolve('Success');
});