मुझे यह त्रुटि मिल रही है - एक अनमाउंट घटक पर एक प्रतिक्रिया राज्य अद्यतन नहीं कर सकता। यह एक नो-ऑप है, लेकिन यह आपके एप्लिकेशन में मेमोरी लीक को इंगित करता है। ठीक करने के लिए, एक useEffect क्लीनअप फ़ंक्शन में सभी सदस्यता और अतुल्यकालिक कार्यों को रद्द करें।

यहां मेरा उपयोग प्रभाव हुक है, मैंने यह जांचने के लिए माउंटेड नामक एक रेफरी का उपयोग किया है कि घटक अनमाउंट किया गया है या नहीं, लेकिन घटक के अनमाउंट होने पर मुझे अभी भी त्रुटि मिल रही है। (त्रुटि दिखाई देने में लगभग एक मिनट का समय लगता है)।

    useEffect(() => {
            if(mounted.current){
                if(mincounter === 0 && hrcounter > 0){ 
                    setHrcounter(hrcounter - 1);
                    setMincounter(60);
                    mincounter > 0 && setTimeout(() => setMincounter(mincounter - 1) , 1000*60)
                }else if (mincounter === 0 && hrcounter === 0){
                    submitHandler()
                }else{
                    mincounter > 0 && setTimeout(() => setMincounter(mincounter - 1) , 1000*60)
                }
            }
        return () => {
            mounted.current = false
            console.log('info tab unmounting', mounted.current);
        }
    }, [mincounter, hrcounter, submitHandler,setHrcounter,setMincounter]);

तिया

4
dlya 16 अगस्त 2020, 07:13

2 जवाब

सबसे बढ़िया उत्तर
   const [subscriptions, setSubscriptions] = useState([]);

मैं आमतौर पर अपने सभी सब्सक्रिप्शन को अपने कंपोनेंट स्टेट पर स्टोर करता हूं और फिर उन्हें कॉल करता हूं जब कंपोनेंट अन माउंटेड होगा (useEffect हुक की सफाई में)

इस कदर:

   useEffect(() => {
      const subscription1 = ...
      const subscription2 = ...
      // When you create subscriptions, just store them on state
      setSubscriptions([...subscriptions, subscription1, subscription2]);

      // Cleanup (Detach subscriptions)
      return () => subscriptions.forEach(subscription => subscription)

   },[])
0
Victor Molina 16 अगस्त 2020, 07:25

आप त्रुटि देख रहे हैं क्योंकि घटक अनमाउंट होने के बाद आपका कोड टाइमआउट कॉलबैक में setMincounter को कॉल कर रहा है। अपने अनमाउंट चेक को टाइमआउट कॉलबैक के अंदर ले जाएं।

आपके कोड में एक और समस्या यह है कि आप किसी भी सफाई पर mounted.current से false सेट कर रहे हैं, न कि केवल अनमाउंट। इसका मतलब है कि प्रभाव कॉलबैक केवल एक बार चलेगा और फिर हर बार अगर स्थिति पर शॉर्ट-सर्किट होगा। आइए इसके बजाय अपने संभावित असुरक्षित कॉलबैक को नो-ऑप से बदलकर साफ करें। वैकल्पिक रूप से आप टाइमआउट रद्द करके सफाई कर सकते हैं।

यहाँ निश्चित कोड है।

useEffect(() => {
    let safeSetMincounter = setMinCounter;
    if(mincounter === 0 && hrcounter > 0){ 
    setHrcounter(hrcounter - 1);
        setMincounter(60);
        mincounter > 0 && setTimeout(() => safeSetMincounter(mincounter - 1), 1000*60)
    }else if (mincounter === 0 && hrcounter === 0){
        submitHandler()
    }else{
        mincounter > 0 && setTimeout(() => safeSetMincounter(mincounter - 1), 1000*60)
    }
    return () => void (safeSetMincounter = () => undefined);
}, [mincounter, hrcounter, submitHandler,setHrcounter,setMincounter]);

कोड में अभी भी कई अन्य समस्याएं हैं लेकिन वे इस प्रश्न के लिए विषय-वस्तु नहीं हैं।

1
Jemi Salo 16 अगस्त 2020, 11:43