मैंने इस मुद्दे पर कुछ विषयों को देखा है 'this.setState एक फ़ंक्शन नहीं है', लेकिन किसी ने भी इसे मेरे लिए तय नहीं किया है। मैंने तीर कार्यों का उपयोग किया है या 'यह' बाध्यकारी है, लेकिन फिर भी त्रुटि मिल रही है। प्रारंभिक प्रयास नीचे है। यह नेस्टेड सेटटाइमआउट फ़ंक्शंस का उपयोग करता है (मैं समझा सकता हूं कि अगर यह मदद करेगा), लेकिन समस्या इस के आसपास है। सेटस्टेट।

'UseEffect' हुक को देखे बिना, क्या मैं जांच सकता हूं कि नीचे दिए गए कोड में प्रतिक्रिया में राज्य स्थापित करने के लिए मुझे कुछ बुनियादी/मौलिक याद आ रही है या नहीं?

let delay = 5000;
      var startTime = new Date().getTime();

      let intervalTimerId = setTimeout(function request() {

        // first apply a random number to a div
        let randomNum = Math.floor(Math.random() * 6) + 1;
        // document.querySelectorAll(".someClass"+randomNum)[0].setAttribute("id", "test");

        // then after a second, remove the class
        setTimeout(() => {
          // document.querySelectorAll(".someClass"+randomNum)[0].setAttribute("id", "");

          // after another second, set state to use later
          setTimeout(() => {
            this.setState({someState: "testing"});
          }, 1000)

        }, 1000)

        // set new delay time
        if (new Date().getTime() - startTime > 9000) {
          delay = 3000;
        }

        console.log(new Date().getTime() - startTime)

        intervalTimerId = setTimeout(request, delay);

      }, delay);
0
jkthompson83 30 नवम्बर 2020, 11:41

3 जवाब

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

आप तीर फ़ंक्शन का उपयोग करने का प्रयास कर सकते हैं

let delay = 5000;
var startTime = new Date().getTime();

const request = () => {
  // first apply a random number to a div
  let randomNum = Math.floor(Math.random() * 6) + 1;
  // document.querySelectorAll(".someClass"+randomNum)[0].setAttribute("id", "test");

  // then after a second, remove the class
  setTimeout(() => {
    // document.querySelectorAll(".someClass"+randomNum)[0].setAttribute("id", "");

    // after another second, set state to use later
    setTimeout(() => {
      this.setState({ someState: 'testing' });
    }, 1000);
  }, 1000);

  // set new delay time
  if (new Date().getTime() - startTime > 9000) {
    delay = 3000;
  }

  console.log(new Date().getTime() - startTime);

  intervalTimerId = setTimeout(request, delay);
};

let intervalTimerId = setTimeout(request, delay);
0
baymax 30 नवम्बर 2020, 12:09

आप बाइंड का उपयोग करने का प्रयास कर सकते हैं:

let intervalTimerId = setTimeout(function request() { ... }.bind(this)

यह मानते हुए कि आप एक वर्ग घटक का उपयोग कर रहे हैं और this पहले से टूटा नहीं है, प्रेरणा वर्ग घटकों का उपयोग नहीं करने के लिए:

कोड पुन: उपयोग और कोड संगठन को और अधिक कठिन बनाने के अलावा, हमने पाया है कि कक्षाएं रिएक्ट सीखने में एक बड़ी बाधा हो सकती हैं। आपको यह समझना होगा कि यह जावास्क्रिप्ट में कैसे काम करता है, जो कि अधिकांश भाषाओं में काम करने के तरीके से बहुत अलग है।

0
HMR 30 नवम्बर 2020, 11:52

आप या तो इसे स्पष्ट रूप से .bind(this) से बाँध सकते हैं या बस फ़ंक्शन सिंटैक्स को एरो फ़ंक्शन से बदल सकते हैं, क्योंकि this एरो फ़ंक्शन के भीतर बाहरी this के बराबर है जहाँ फ़ंक्शन घोषित किया गया है:

let intervalTimerId = setTimeout(() => {
    ...
    setTimeout(() => {
       this.setState({someState: "testing"});
    }, 1000)
}, delay);

0
Aadil Mehraj 30 नवम्बर 2020, 11:56