मैं पिछले राज्य (array of objects) के आधार पर object के नए आने वाले मानों के साथ राज्य को अपडेट करने का प्रयास कर रहा हूं। लेकिन कुछ कारणों से ऐसा नहीं हो पाता...

मैं क्या गलत कर रहा हूँ? मेरा कोड:

   handleCommentSubmit = (newEmployer) => {
       console.log('handleCommentSubmit BEFORE', this.state.employers, newEmployer); // array(5)
       this.setState((prevState, newEmployer) => { 
         employers: prevState.employers + newEmployer
       });
       console.log('handleCommentSubmit AFTER', this.state.employers); // still array(5)
   }

मेरा लॉग:

handleCommentSubmit BEFORE (6) [{…}, {…}, {…}, {…}, {…}, {…}], newEmployer: {first_name: "sdfsdf", last_name: "sdfsdf", birth_date: "123123-03-12", salary: "123123123"}
handleCommentSubmit AFTER (6) [{…}, {…}, {…}, {…}, {…}, {…}]
6
Max Wolfen 12 अप्रैल 2018, 12:21

4 जवाब

सबसे बढ़िया उत्तर

this.setState को तर्क के रूप में वस्तु प्राप्त करनी चाहिए। एक समारोह नहीं। आप आसानी से this.state का उपयोग कर सकते हैं:

handleCommentSubmit = (newEmployer) => {
  this.setState({ 
    employers: this.state.employers.concat(newEmployer)
  });
}
-6
asiniy 12 अप्रैल 2018, 12:26

यदि आपका employers एक ऐरे है तो आप spread operator सेटस्टेट में उपयोग कर सकते हैं:

[...prevState.employers, newEmployer]

लेकिन आपको prevState की बिल्कुल भी आवश्यकता नहीं है। आप बस कर सकते हैं:

this.setState({ 
         employers: [...this.state.employers, newEmployer]
       });
2
Arkej 12 अप्रैल 2018, 12:29

परिवर्तन:

1- setState async है इसलिए अपडेट किए गए मान की जांच के लिए कॉलबैक का उपयोग करें।

2- सरणी में एक नया मान पुश करने के लिए [].concat का प्रयोग करें, + काम नहीं करेगा।

3- आप अपडेटर फ़ंक्शन से object वापस नहीं कर रहे हैं।

इसे इस तरह लिखें:

handleCommentSubmit = (newEmployer) => {
    this.setState((prevState, newEmployer) => ({
        employers: prevState.employers.concat(newEmployer)
    }), () => {
        console.log('handleCommentSubmit AFTER', this.state.employers);
    }); 
}

अधिक विवरण के लिए यह उत्तर देखें:

सेटस्टेट विधि को कॉल करना राज्य को तुरंत क्यों नहीं बदलता है?

9
Mayank Shukla 12 अप्रैल 2018, 12:48

यदि आप सेटस्टेट को कॉल करते हैं तो यह अगली पंक्ति में तुरंत अपडेट नहीं होगा। रेंडर विधि को कॉल करने के बाद यह अपडेट हो जाएगा। यदि आप अपडेटेडस्टेट देखना चाहते हैं तो आप इस तरह सेटस्टेट में कॉलबैक फ़ंक्शन लिख सकते हैं।

this.setState((prevState, newEmployer) => { 
         employers: prevState.employers + newEmployer
       }, () => console.log('UpdatedState', this.state.employers));
2
HoldOffHunger 10 अगस्त 2020, 23:45