改变一个反应状态的首选方法是什么?

假设我在 this.state.list中有一个普通对象列表,然后我可以用它来呈现一个子对象列表。那么将对象插入 this.state.list的正确方法是什么呢?

下面是唯一的方式,我认为它将工作,因为你不能突变的 this.state直接在文件中提到。

this._list.push(newObject):
this.setState({list: this._list});

这对我来说太丑陋了,还有更好的办法吗?

75812 次浏览

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])
}));