आम गलतियाँ प्रतिक्रिया में और उन्हें कैसे बचें

Ovrsea में, जब नए प्रशिक्षु आते हैं, तो वे प्रतिक्रिया शुरू करते समय छोटी लेकिन समय लेने वाली गलतियों से जूझते हैं। इसीलिए मैं आपको भविष्य में होने वाले सिरदर्द से बचने के लिए उन सबसे सामान्य गलतियों को कवर करूँगा।

TL; DR: आपके पास…

  • ... एक रेंडर मुद्दा, उदाहरण के लिए एक अनंत लूप, आप एक कॉलबैक (4 बिंदु) में तीर भूल गए हो सकते हैं।
  • ... ऐसा फ़ंक्शन जो ट्रिगर किया गया है, जबकि यह आपके कॉलबैक (बिंदु 4) की भी जांच नहीं करता है।
  • ... एक राज्य चर, जो ठीक से नहीं बदलता है, आपके राज्य चर (म्यूट 2) परिवर्तित हो सकते हैं।
  • ... उन घटकों की एक सूची जो अच्छी तरह से अपडेट नहीं होती है, आपने शायद अपनी कुंजी (बिंदु 1) सेट नहीं की है।
  • ... एक घटक जो राज्य में परिवर्तन के बाद अपडेट नहीं करता है, शायद आपको पता नहीं है कि सेटस्ट्रेट एसिंक्स्ट है? (बिंदु ३)।

1. आप घटक सूची में got कुंजी ’भूल गए हैं

जब आपके पास मूल्यों की एक सरणी होती है और आप उनमें से प्रत्येक के लिए एक घटक प्रस्तुत करना चाहते हैं, तो आप शायद ऐसा कुछ करेंगे:

const arrest = ['पीला', 'लाल', 'हरा'];
प्रस्तुत करना() {
  वापसी (
    
          {arr.map (रंग =>)         
  • {रंग} )}        ); }

यदि सरणी कभी नहीं बदलती है तो यह ठीक काम करेगा लेकिन अगर आपको इसमें कुछ संशोधन करने हैं, उदाहरण के लिए किसी मान को हटाना या संशोधित करना, तो संभवतः आपके पास कुछ रेंडर मुद्दे होंगे।

यहाँ अभी भी हरा क्यों है?

लूप के अंदर घटक की कुंजी जोड़कर इस समस्या को आसानी से हल किया जा सकता है। यह प्रतिक्रिया करने में मदद करेगा कि क्या तत्व बदल गया है।

  {रंग}

लेकिन सावधान रहें, चाबियाँ अद्वितीय होनी चाहिए!

आप अपने ऐरे इंडेक्स का उपयोग नहीं करना चाहते हैं, क्योंकि एरे ऑर्डर या आकार में बदलाव होने पर यह फिर से असाइन हो जाएगा। इस उदाहरण में हम केवल कुंजी के रूप में रंग का उपयोग कर सकते हैं, लेकिन अगर एक ही रंग सरणी में दो बार शामिल है तो यह अप्रत्याशित व्यवहार का कारण बनेगा ...

यदि आप आईडी या किसी विशिष्ट संपत्ति के साथ वस्तुओं की एक सरणी को मैप करते हैं तो आप इसका उपयोग कर सकते हैं, अन्यथा आप अभी भी सूचकांक का उपयोग कर सकते हैं लेकिन केवल अंतिम उपाय पर।

2. आपने एक स्टेट वैरिएबल म्यूट किया है

कल्पना करें कि हमारे राज्य में रंग की एक सरणी है:

राज्य = {
  गिरफ्तारी: ['लाल', 'पीला'],
};

हम पहले तत्व के रंग को हरे रंग में बदलना चाहते हैं, इसलिए हम एक फ़ंक्शन लिखते हैं जो राज्य को संशोधित करता है:

changeColorToGreen = () => {
  const arrest = this.state.arr;

  गिरफ्तार [0] = 'हरा';

  this.setState ({arr});
};

यह हमारे राज्य को सही ढंग से बदल देगा लेकिन हमारे पास इस तरह से कुछ अप्रत्याशित व्यवहार हो सकता है। प्रतिक्रिया स्मृति में ऑब्जेक्ट संदर्भ परिवर्तनों की तलाश कर रही है जब वह रेंडर करने का निर्णय लेता है या नहीं, उस स्थिति में ऑब्जेक्ट अभी भी मेमोरी में समान है और केवल यह सामग्री बदल गई है। जब भी रंग बदलते हैं, तो प्रॉप के रूप में सरणी का उपयोग करने वाले घटक ठीक से रेंडर नहीं कर सकते हैं।

changeColorToGreen = () => {
  const arrest = this.state.arr.slice ();
  // .slice () सरणी की उथली प्रति लौटाएं
  // हम ES6 स्प्रेड ऑपरेटर का भी उपयोग कर सकते हैं:
  // const arr = [... this.state.arr]
  गिरफ्तार [0] = 'हरा';

  this.setState ({arr});
};

इस बार हमारी सरणी अच्छी तरह से आश्वस्त हुई है और स्मृति में इसका संदर्भ बदल गया है, हम अपने राज्य को अपरिवर्तनीय रखते हैं।

3. आप भूल गए कि setState एसिंक्रोनस है

जब आपको राज्य में एक मूल्य बदलना होता है, तो आपको सेटस्टेट फ़ंक्शन का उपयोग करना होगा जैसा कि हमने पिछले उदाहरणों में देखा था। लेकिन अगर हम एक ही फ़ंक्शन में कई बार सेटस्टेट का उपयोग करने की कोशिश करते हैं, तो हम कुछ अप्रत्याशित व्यवहार कर सकते हैं।

राज्य = {
  काउंटर: 1,
};

incrementCounter = () => {
  it.setState ({काउंटर: this.state.counter + 1});
  it.setState ({काउंटर: this.state.counter + 1});
  it.setState ({काउंटर: this.state.counter + 1});
};

इस उदाहरण में, हम उम्मीद करते हैं कि काउंटर 4 होगा। लेकिन जैसा कि सेटस्टैट असिंच है, इसके पास अगली कॉल होने पर मूल्य बदलने के लिए पर्याप्त समय नहीं होगा। तो, तीसरी कॉल पर, यह .state.counter अभी भी 1 पर है और परिणाम केवल 2 होगा।

इंक्रीमेंट एनकाउंटर के लिए प्रत्येक कॉल 3 के बजाय 1 से काउंटर बढ़ाएगा।

CodePen पर इसे आज़माएं।

4. आप कॉलबैक में तीर भूल गए

जब शुरुआती लोगों को पहली बार तीर के कार्यों से निपटना पड़ता है, तो वे अक्सर अपने वाक्यविन्यास को गलत समझते हैं। सबसे आम गलती बेलो देखें जो वे आमतौर पर करते हैं:

राज्य = {
  काउंटर: 1,
};

वेतन वृद्धि = (राशि) => {
  it.setState ({काउंटर: this.state.counter + राशि});
};

प्रस्तुत करना() {
  वापसी (
    
      

{this.state.counter}       <बटन onClick = {this.incrementCounter (5)} />        ); }

इस उदाहरण में, हमारे पास एक बटन होता है, जो onClick ट्रिगर होने पर incrementCounter फ़ंक्शन को कॉल करता है। समस्या यह है कि यह इंक्रीमेंट एनकाउंटर फ़ंक्शन की वापसी है जो ऑनक्लिक करने के लिए असाइन किया गया है, न कि फ़ंक्शन। जैसे ही कंपोनेंट रेंडर होगा वैसे ही इंक्रीमेंट एनकाउंटर शुरू हो जाएगा।

तीर फ़ंक्शन का उपयोग करने के लिए घटनाओं पर एक फ़ंक्शन असाइन करने का सही तरीका है:

onClick = {() => this.incrementCounter (5)}

जब आपको अपने फ़ंक्शन में पैरामीटर की आवश्यकता नहीं होती है या पैरामीटर सीधे ईवेंट द्वारा दिए जाते हैं, तो आप बस इसे इस तरह लिख सकते हैं:

onClick = {} this.myFunction
// onClick = {(e) => this.myFunction (e)} के समान है

आगे पढ़ने के लिए

  • प्रतिक्रिया सूची और कुंजी: https://reactjs.org/docs/lists-and-keys.html
  • क्यों अपरिवर्तनीयता महत्वपूर्ण है: https://reactjs.org/tutorial/tutorial.html#why-immutability-is-imantant
  • क्यों सेट करें अतुल्यकालिक: https://github.com/facebook/react/issues/11527#issuecomment-360199710
  • घटकों के लिए कार्य करना: https://reactjs.org/docs/faq-functions.html

यह सभी देखें

आप अपनी खुद की वेबसाइट कैसे शुरू कर सकते हैं? अपनी वेबसाइट शुरू करने के लिए मुझे कितने पैसे की आवश्यकता होगी?किसी लड़की से कैसे पूछें कि उसका दिन कैसा थामुझे मुफ्त डोमेन और होस्टिंग कैसे मिल सकती है? अगर मैं हर दिन 1000 अद्वितीय आगंतुकों को अपने ब्लॉगिंग वेबसाइट से छह महीने में कितना कमा सकता हूं? वेबसाइट विकास ग्राहक प्राप्त करने के सर्वोत्तम तरीके क्या हैं? मैं फ्रीलांसिंग को छोड़कर तरीके खोज रहा हूं। मैं मार्केटिंग कैसे करूं और ग्राहकों को कैसे प्राप्त करूं?आप एपीआई आधारित सास सेवाओं / उत्पादों की कीमत कैसे लेते हैं? क्या HTML और CSS को मास्टर करना आसान है? इसमें कितना समय लगता है?क्या किसी को एक वेब डेवलपर बनाता है? आप कैसे जानते हैं कि आप अब वेब विकास परियोजनाओं को संभालने में सक्षम हैं? ज्ञान के किस स्तर की आवश्यकता है?