प्रतिक्रिया useEffect
हुक
useEffect
हुक आपको अपने घटकों में साइड इफेक्ट करने की अनुमति देता है ।
साइड इफेक्ट के कुछ उदाहरण हैं: डेटा प्राप्त करना, सीधे DOM को अपडेट करना, और टाइमर।
useEffect
दो तर्क स्वीकार करता है। दूसरा तर्क वैकल्पिक है।
useEffect(<function>, <dependency>)
आइए एक उदाहरण के रूप में टाइमर का उपयोग करें।
उदाहरण:
setTimeout()
प्रारंभिक रेंडर के बाद 1 सेकंड गिनने के लिए उपयोग करें :
import { useState, useEffect } from "react";
import ReactDOM from "react-dom";
function Timer() {
const [count, setCount] = useState(0);
useEffect(() => {
setTimeout(() => {
setCount((count) => count + 1);
}, 1000);
});
return <h1>I've rendered {count} times!</h1>;
}
ReactDOM.render(<Timer />, document.getElementById('root'));
लेकिन रुकें!! मैं गिनता रहता हूँ भले ही इसे केवल एक बार गिनना चाहिए!
useEffect
हर रेंडर पर चलता है। इसका मतलब है कि जब गिनती बदलती है, तो एक रेंडर होता है, जो फिर दूसरे प्रभाव को ट्रिगर करता है।
हम यही नहीं चाहते। साइड इफेक्ट चलने पर इसे नियंत्रित करने के कई तरीके हैं।
हमें हमेशा दूसरा पैरामीटर शामिल करना चाहिए जो एक सरणी स्वीकार करता है। useEffect
हम वैकल्पिक रूप से इस सरणी में निर्भरताएँ पास कर सकते हैं ।
1. कोई निर्भरता पारित नहीं हुई:
useEffect(() => {
//Runs on every render
});
2. एक खाली सरणी:
useEffect(() => {
//Runs only on the first render
}, []);
3. सहारा या राज्य मूल्य:
useEffect(() => {
//Runs on the first render
//And any time any dependency value changes
}, [prop, state]);
तो, इस समस्या को ठीक करने के लिए, आइए इस प्रभाव को केवल प्रारंभिक रेंडर पर चलाते हैं।
उदाहरण:
केवल प्रारंभिक रेंडर पर प्रभाव चलाएं:
import { useState, useEffect } from "react";
import ReactDOM from "react-dom";
function Timer() {
const [count, setCount] = useState(0);
useEffect(() => {
setTimeout(() => {
setCount((count) => count + 1);
}, 1000);
}, []); // <- add empty brackets here
return <h1>I've rendered {count} times!</h1>;
}
ReactDOM.render(<Timer />, document.getElementById('root'));
उदाहरण:
यहां एक useEffect
हुक का उदाहरण दिया गया है जो एक चर पर निर्भर है। यदि count
चर अद्यतन करता है, तो प्रभाव फिर से चलेगा:
import { useState, useEffect } from "react";
import ReactDOM from "react-dom";
function Counter() {
const [count, setCount] = useState(0);
const [calculation, setCalculation] = useState(0);
useEffect(() => {
setCalculation(() => count * 2);
}, [count]); // <- add the count variable here
return (
<>
<p>Count: {count}</p>
<button onClick={() => setCount((c) => c + 1)}>+</button>
<p>Calculation: {calculation}</p>
</>
);
}
ReactDOM.render(<Counter />, document.getElementById('root'));
यदि कई निर्भरताएँ हैं, तो उन्हें useEffect
निर्भरता सरणी में शामिल किया जाना चाहिए।
प्रमाणन हासिल करें!
$95 नामांकन
प्रभाव सफाई
स्मृति रिसाव को कम करने के लिए कुछ प्रभावों के लिए सफाई की आवश्यकता होती है।
टाइमआउट, सब्सक्रिप्शन, ईवेंट श्रोता और अन्य प्रभाव जिनकी अब आवश्यकता नहीं है, का निपटारा किया जाना चाहिए।
useEffect
हम हुक के अंत में एक रिटर्न फ़ंक्शन को शामिल करके ऐसा करते हैं ।
उदाहरण:
useEffect
हुक के अंत में टाइमर को साफ करें :
import { useState, useEffect } from "react";
import ReactDOM from "react-dom";
function Timer() {
const [count, setCount] = useState(0);
useEffect(() => {
let timer = setTimeout(() => {
setCount((count) => count + 1);
}, 1000);
return () => clearTimeout(timer)
}, []);
return <h1>I've rendered {count} times!</h1>;
}
ReactDOM.render(<Timer />, document.getElementById("root"));
नोट: टाइमर को साफ़ करने के लिए, हमें इसे नाम देना होगा।