प्रतिक्रिया बैच अपडेट कर सकती है, और इसलिए सही तरीका यह है कि अपडेट को निष्पादित करने वाले फ़ंक्शन के साथ सेटस्ट्रेट प्रदान करें।
प्रतिक्रिया अद्यतन addon के लिए, निम्नलिखित मज़बूती से काम करेगा:
this.setState( state => update(state, {array: {$push: [4]}}) );
या समवर्ती के लिए ():
this.setState( state => ({
array: state.array.concat([4])
}));
निम्नलिखित दिखाता है कि https://jsbin.com/mofekakuqi/7/edit?js,output उदाहरण के रूप में क्या होता है यदि आप इसे गलत पाते हैं।
सेटटाइमआउट () इनवोकेशन सही ढंग से तीन आइटम जोड़ता है क्योंकि रिएक्ट एक सेटटाइमआउट कॉलबैक के भीतर बैच अपडेट नहीं करेगा (देखें https://groups.google.com/d/msg/reactjs/G6pljvpTGX0/0ihYR2zK9dEJ )।
छोटी गाड़ी 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'));