React có thể cập nhật hàng loạt và do đó, cách tiếp cận đúng là cung cấp cho setState một chức năng thực hiện cập nhật.
Đối với addon cập nhật React, phần sau sẽ hoạt động đáng tin cậy:
this.setState( state => update(state, {array: {$push: [4]}}) );
hoặc cho concat ():
this.setState( state => ({
array: state.array.concat([4])
}));
Sau đây cho thấy https://jsbin.com/mofekakuqi/7/edit?js,output là một ví dụ về những gì xảy ra nếu bạn hiểu sai.
Lệnh gọi setTimeout () thêm chính xác ba mục vì React sẽ không cập nhật hàng loạt trong một cuộc gọi lại setTimeout (xem https://groups.google.com/d/msg/reactjs/G6pljvpTGX0/0ihYw2zK9dEJ ).
Lỗi onClick sẽ chỉ thêm "Thứ ba", nhưng lỗi cố định, sẽ thêm F, S và T như mong đợi.
class List extends React.Component {
constructor(props) {
super(props);
this.state = {
array: []
}
setTimeout(this.addSome, 500);
}
addSome = () => {
this.setState(
update(this.state, {array: {$push: ["First"]}}));
this.setState(
update(this.state, {array: {$push: ["Second"]}}));
this.setState(
update(this.state, {array: {$push: ["Third"]}}));
};
addSomeFixed = () => {
this.setState( state =>
update(state, {array: {$push: ["F"]}}));
this.setState( state =>
update(state, {array: {$push: ["S"]}}));
this.setState( state =>
update(state, {array: {$push: ["T"]}}));
};
render() {
const list = this.state.array.map((item, i) => {
return <li key={i}>{item}</li>
});
console.log(this.state);
return (
<div className='list'>
<button onClick={this.addSome}>add three</button>
<button onClick={this.addSomeFixed}>add three (fixed)</button>
<ul>
{list}
</ul>
</div>
);
}
};
ReactDOM.render(<List />, document.getElementById('app'));