कुछ घटक में एक काउंटर बढ़ाने की कल्पना करें:
class SomeComponent extends Component{
state = {
updatedByDiv: '',
updatedByBtn: '',
counter: 0
}
divCountHandler = () => {
this.setState({
updatedByDiv: 'Div',
counter: this.state.counter + 1
});
console.log('divCountHandler executed');
}
btnCountHandler = () => {
this.setState({
updatedByBtn: 'Button',
counter: this.state.counter + 1
});
console.log('btnCountHandler executed');
}
...
...
render(){
return (
...
// a parent div
<div onClick={this.divCountHandler}>
// a child button
<button onClick={this.btnCountHandler}>Increment Count</button>
</div>
...
)
}
}
माता-पिता और बाल घटकों दोनों के लिए एक गिनती हैंडलर जुड़ा हुआ है। यह जानबूझकर किया जाता है इसलिए हम सेटस्टैट () को एक ही क्लिक ईवेंट बबलिंग संदर्भ में दो बार निष्पादित कर सकते हैं, लेकिन 2 अलग-अलग हैंडलर के भीतर से।
जैसा कि हम कल्पना करेंगे, बटन पर एक सिंगल क्लिक इवेंट अब इन दोनों हैंडलर को ट्रिगर करेगा क्योंकि ईवेंट बबलिंग चरण के दौरान लक्ष्य से सबसे बाहरी कंटेनर तक बुलबुले।
इसलिए btnCountHandler () पहले निष्पादित करता है, 1 की गिनती में वृद्धि करने की अपेक्षा करता है और फिर divCountHandler () निष्पादित करता है, गणना को 2 तक बढ़ाने की अपेक्षा करता है।
हालाँकि आप केवल 1 में वृद्धि की गणना करते हैं क्योंकि आप रिएक्टर डेवलपर टूल में निरीक्षण कर सकते हैं।
यह साबित करता है कि प्रतिक्रिया
सभी सेटस्टेट कॉल को कतार में रखता है
संदर्भ में अंतिम विधि (इस मामले में divCountHandler) निष्पादित करने के बाद इस कतार में वापस आ जाता है
एक ही संदर्भ में कई सेटस्टैट कॉल के भीतर होने वाली सभी ऑब्जेक्ट म्यूटेशन को मर्ज करता है (एक एकल चरण के लिए सभी विधि कॉल उदाहरण के लिए समान है) एक एकल ऑब्जेक्ट म्यूटेशन सिंटैक्स में (विलय करना समझ में आता है क्योंकि यही कारण है कि हम राज्य को स्वतंत्र रूप से अपडेट कर सकते हैं सेटस्टैट में () पहले स्थान पर
और इसे एक सिंगल सेटस्टैट () में कई सेटस्टेट () कॉल के कारण फिर से रेंडर करने से रोकने के लिए (यह बैचिंग का एक बहुत ही आदिम वर्णन है)।
प्रतिक्रिया द्वारा संचालित परिणामी कोड:
this.setState({
updatedByDiv: 'Div',
updatedByBtn: 'Button',
counter: this.state.counter + 1
})
इस व्यवहार को रोकने के लिए, सेटस्टैट विधि में तर्क के रूप में ऑब्जेक्ट्स को पास करने के बजाय, कॉलबैक को पास किया जाता है।
divCountHandler = () => {
this.setState((prevState, props) => {
return {
updatedByDiv: 'Div',
counter: prevState.counter + 1
};
});
console.log('divCountHandler executed');
}
btnCountHandler = () => {
this.setState((prevState, props) => {
return {
updatedByBtn: 'Button',
counter: prevState.counter + 1
};
});
console.log('btnCountHandler executed');
}
अंतिम विधि के बाद निष्पादन समाप्त हो जाता है और जब प्रतिक्रिया सेटस्टैट कतार को संसाधित करने के लिए वापस आती है, तो यह पिछले घटक स्थिति में गुजरते हुए, प्रत्येक सेटस्टेट कतार के लिए कॉलबैक को कॉल करता है।
इस तरह से प्रतिक्रिया यह सुनिश्चित करती है कि कतार में अंतिम कॉलबैक उस स्थिति को अपडेट करने के लिए मिलता है जो उसके सभी पिछले समकक्षों ने हाथ रखा है।