假设我有一个普通对象列表,this.state.list
然后我可以用它来渲染一个孩子的列表。那么将对象插入的正确方法是什么this.state.list
?
下面是我认为它会起作用的唯一方法,因为您不能this.state
像文档中提到的那样直接改变。
this._list.push(newObject):
this.setState({list: this._list});
这对我来说似乎很丑陋。有没有更好的办法?
假设我有一个普通对象列表,this.state.list
然后我可以用它来渲染一个孩子的列表。那么将对象插入的正确方法是什么this.state.list
?
下面是我认为它会起作用的唯一方法,因为您不能this.state
像文档中提到的那样直接改变。
this._list.push(newObject):
this.setState({list: this._list});
这对我来说似乎很丑陋。有没有更好的办法?
concat
返回一个新数组,所以你可以做
this.setState({list: this.state.list.concat([newObject])});
另一种选择是 React 的immutability helper
var newState = React.addons.update(this.state, {
list : {
$push : [newObject]
}
});
this.setState(newState);
可以使用函数作为参数调用setState():
this.setState((state) => ({ list: state.list.concat(newObj) }))
或在 ES5 中:
this.setState(function(state) {
return {
list: state.list.concat(newObj)
}
})
2016 年更新
使用 ES6,您可以使用:
this.setState({ list: [...this.state.list, ...newObject] });
从react文档(https://facebook.github.io/react/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous):
因为 this.props 和 this.state 可能会异步更新,所以你不应该依赖它们的值来计算下一个状态。
所以你应该这样做:
this.setState((prevState) => ({
contacts: prevState.contacts.concat([contact])
}));