ปฏิกิริยาอาจแบตช์อัพเดทและดังนั้นวิธีการที่ถูกต้องคือการให้ setState ด้วยฟังก์ชั่นที่ดำเนินการปรับปรุง
สำหรับ Addact การอัพเดท React ข้อมูลต่อไปนี้จะทำงานได้อย่างน่าเชื่อถือ:
this.setState( state => update(state, {array: {$push: [4]}}) );
หรือสำหรับ concat ():
this.setState( state => ({
array: state.array.concat([4])
}));
ต่อไปนี้แสดงสิ่งที่https://jsbin.com/mofekakuqi/7/edit?js,outputเป็นตัวอย่างของสิ่งที่เกิดขึ้นหากคุณทำผิด
การเรียกใช้ setTimeout () เพิ่มอย่างถูกต้องสามรายการเนื่องจาก React จะไม่อัปเดตแบตช์ในการโทรกลับ setTimeout (ดูhttps://groups.google.com/d/msg/reactjs/G6pljvpTGX0/0ihYw2zK9dEJ )
buggy onClick จะเพิ่ม "สาม" เท่านั้น แต่อันที่แก้ไขจะเพิ่ม F, S และ T ตามที่คาดไว้
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'));