Kodokon kodokon.com

useEffect: इफ़ेक्ट, डिपेंडेंसी, क्लीनअप

useEffect का उपयोग करके अपने कंपोनेंट को बाहरी दुनिया के साथ सिंक्रनाइज़ करें, डिपेंडेंसी और क्लीनअप में महारत हासिल करें।

9 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

एक React कंपोनेंट props और state से JSX की गणना करता है। उस दायरे के बाहर की कोई भी चीज़ - डॉक्यूमेंट का शीर्षक बदलना, एक टाइमर शुरू करना, किसी ब्राउज़र इवेंट की सदस्यता लेना - एक साइड इफ़ेक्ट है। useEffect उस कोड को रेंडरिंग के बाद चलाता है, प्रदर्शन को अवरुद्ध किए बिना, और कुछ मान बदलने पर उसे फिर से सिंक्रनाइज़ करता है।

JSX
import { useEffect } from "react";

function CartTitle({ count }) {
  useEffect(() => {
    document.title = `Cart (${count})`;
  }, [count]);

  return <p>Items: {count}</p>;
}
इफ़ेक्ट केवल तभी दोबारा चलता है जब count बदलती है।

डिपेंडेंसी ऐरे नियंत्रित करती है कि इफ़ेक्ट कितनी बार चलता है। [count]: हर उस render के बाद इफ़ेक्ट दोबारा चलता है जहाँ count बदली। []: इफ़ेक्ट केवल एक बार चलता है, पहले render के बाद। कोई ऐरे नहीं: इफ़ेक्ट हर render के बाद दोबारा चलता है, जो शायद ही कभी आप चाहते हैं। सुनहरा नियम: इफ़ेक्ट के भीतर उपयोग किया गया हर कंपोनेंट मान ऐरे में दिखना चाहिए।

JSX
import { useEffect, useState } from "react";

function Timer() {
  const [seconds, setSeconds] = useState(0);

  useEffect(() => {
    const id = setInterval(() => {
      setSeconds((s) => s + 1);
    }, 1000);

    return () => clearInterval(id);
  }, []);

  return <p>Elapsed: {seconds} s</p>;
}
clearInterval के बिना, टाइमर कंपोनेंट से ज़्यादा समय तक जीवित रहता।

इफ़ेक्ट द्वारा लौटाया गया फ़ंक्शन क्लीनअप फ़ंक्शन है। React इसे इफ़ेक्ट के हर नए रन से पहले कॉल करता है, फिर एक आख़िरी बार जब कंपोनेंट अनमाउंट होता है। यही रिसाव को रोकता है: अनाथ टाइमर, ढेर हुए लिसनर, कभी रद्द न होने वाली सदस्यताएँ। हर इफ़ेक्ट जो कुछ “खोलता” है, उसे फिर से बंद करना होगा।

JSX
useEffect(() => {
  function onResize() {
    setWidth(window.innerWidth);
  }
  window.addEventListener("resize", onResize);

  return () => {
    window.removeEventListener("resize", onResize);
  };
}, []);
resize इवेंट की सदस्यता, अनमाउंट पर रद्द की गई।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. useEffect(fn, []) के साथ, फ़ंक्शन fn कब निष्पादित होता है?
    • कंपोनेंट के हर render से पहले
    • केवल पहले render के बाद
    • हर state अपडेट पर
  2. किसी इफ़ेक्ट द्वारा लौटाया गया क्लीनअप फ़ंक्शन कब कॉल होता है?
    • केवल तब जब कंपोनेंट अनमाउंट होता है
    • इफ़ेक्ट के हर दोबारा रन से पहले और अनमाउंट पर
    • कंपोनेंट के पहले render से ठीक पहले
    • कभी स्वतः नहीं: आपको इसे खुद कॉल करना होता है
  3. एक इफ़ेक्ट userId पढ़ता है पर उसकी डिपेंडेंसी ऐरे [] है। समस्या क्या है?
    • userId बदलने पर इफ़ेक्ट दोबारा नहीं चलेगा और एक बासी मान रखेगा
    • React पहले render पर एक त्रुटि फेंकेगा
    • इफ़ेक्ट एक अनंत लूप में दोबारा चलेगा