Let's say I have a list of plain objects in my this.state.list
that I can then use to render a list of children. What then is the right way to insert object into this.state.list
?
Below is the only way I think it will work because you can not mutate the this.state
directly as mentioned in the doc.
this._list.push(newObject):
this.setState({list: this._list});
This seems ugly to me. Is there a better way?
In React, the state is immutable. In simple terms it means that you should not modify it directly. Instead a new object should be created to set the state using setState .
Local state is perhaps the easiest kind of state to manage in React, considering there are so many tools built into the core React library for managing it. useState is the first tool you should reach for to manage state in your components. It can take accept any valid data value, including primitive and object values.
One should never update the state directly because of the following reasons: If you update it directly, calling the setState() afterward may just replace the update you made. When you directly update the state, it does not change this.
To run a mutation, you first call useMutation within a React component and pass it a GraphQL string that represents the mutation. When your component renders, useMutation returns a tuple that includes: A mutate function that you can call at any time to execute the mutation.
concat
returns a new array, so you can do
this.setState({list: this.state.list.concat([newObject])});
another alternative is React's immutability helper
var newState = React.addons.update(this.state, {
list : {
$push : [newObject]
}
});
this.setState(newState);
setState() can be called with a function as a parameter:
this.setState((state) => ({ list: state.list.concat(newObj) }))
or in ES5:
this.setState(function(state) {
return {
list: state.list.concat(newObj)
}
})
Update 2016
With ES6 you can use:
this.setState({ list: [...this.state.list, ...newObject] });
From the react docs (https://facebook.github.io/react/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous):
Because this.props and this.state may be updated asynchronously, you should not rely on their values for calculating the next state.
So you should do this instead:
this.setState((prevState) => ({
contacts: prevState.contacts.concat([contact])
}));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With