TechIT TECH IN HINDI
Banti Kevat — Founder TechIT
Founder & Author

Banti Kevat

M.Tech AI Student · Full-Stack Developer · Ujjain, MP 🇮🇳

React, MERN aur AI ko simple Hindi mein sikhaata hoon. Real projects banaye hain — Seva Setu (hyperlocal services) aur UjjainTemple (devotional web). Seekha hua sach mein kaam aata hai. 🚀

0+ Articles
0+ Categories
0% Free
हिंदीEasy Language
✅ Free Forever 🇮🇳 Tech in Hindi 👨‍💻 Real Developer 🚫 No Spam 🎓 M.Tech AI
React Hooks Best Practices Aur Common Mistakes (in Hindi)
Coding info

React Hooks Best Practices Aur Common Mistakes (in Hindi)

TechIT — Banti Kevat जुलाई 14, 2026 5 min read
Listen to this article (Hindi/English)
React Hooks Best Practices Aur Common Mistakes (in Hindi)

✨ Quick Answer: React Hooks use karte waqt ye mistakes na karein! Jaaniye clean aur bug-free code likhne ke liye best practices aur common mistakes Hindi mein.

React Hooks Best Practices Aur Common Mistakes seekhein is Hindi guide me aur design karein clean, optimized aur bug-free React components aasan tarike se.

क्या आपके साथ कभी ऐसा हुआ है कि आपने एक छोटा सा useEffect हुक लिखा, और अचानक आपका पूरा ब्राउज़र हैंग हो गया? या फिर आपने React components में स्टेट अपडेट की, लेकिन कंसोल में अभी भी पुरानी वैल्यू ही दिखाई दे रही है? दोस्तों, React Hooks जितने जादुई और आसान दिखते हैं, उतने ही वे नए डेवलपर्स (और कभी-कभी अनुभवी डेवलपर्स) के लिए एक भूलभुलैया बन जाते हैं।

⚡ Quick Answer: React Hooks Best Practices का पालन करने के लिए हमेशा Hooks को Component के टॉप-लेवल पर कॉल करें, conditional statements में नहीं। useEffect की dependency array को खाली न छोड़ें और stale state से बचने के लिए functional updates का उपयोग करें।

इस कंपलीट मास्टरक्लास ट्यूटोरियल में, हम गहराई से समझेंगे कि React Hooks Best Practices Aur Common Mistakes क्या हैं, वे पर्दे के पीछे कैसे काम करते हैं, और हम उनसे जुड़े बड़े-बड़े बग्स को कैसे चुटकियों में हल कर सकते हैं। चलिए, चाय का कप उठाइए और शुरू करते हैं!

---

React Hooks क्या हैं और ये हमारे लिए क्यों ज़रूरी हैं?

पहले के दिनों में, जब हमें React में State या Lifecycle methods का इस्तेमाल करना होता था, तो हमें Class Components का इस्तेमाल करना पड़ता था। लेकिन Class Components में कोड को रीयूज़ करना और समझना बहुत मुश्किल हो जाता था। this कीवर्ड का कन्फ्यूजन और "Prop Drilling" जैसी समस्याओं ने कोड को मटमैला (messy) बना दिया था।

React 16.8 में Hooks को पेश किया गया था। Hooks हमें बिना Class लिखे State और अन्य React फ़ीचर्स का उपयोग करने की अनुमति देते हैं। लेकिन याद रखिए, ग्रेट पावर के साथ ग्रेट रिस्पॉन्सिबिलिटी भी आती है। अगर हम Hooks के मूल सिद्धांतों को नहीं समझेंगे, तो हमारा एप्लीकेशन परफॉर्मेंस के मामले में पिछड़ जाएगा। आप React की ऑफिशियल गाइडलाइन्स के लिए React Official Documentation भी देख सकते हैं।

---

React Hooks के दो सबसे महत्वपूर्ण नियम (Rules of Hooks)

दोस्तों, Hooks का उपयोग करने के दो सुनहरे नियम हैं, जिन्हें आपको कभी नहीं तोड़ना चाहिए। अगर आप इन नियमों को तोड़ते हैं, तो आपको अजीबोगरीब error का सामना करना पड़ेगा।

  1. Only Call Hooks at the Top Level: कभी भी Hooks को Loops, Conditions, या Nested Functions के अंदर कॉल न करें। Hooks को हमेशा अपने React Function के सबसे ऊपर (Top-Level) ही रखें।
  2. Only Call Hooks from React Functions: Hooks को सिर्फ React Function Components या Custom Hooks के अंदर से ही कॉल करें। सामान्य JavaScript Functions में इन्हें कॉल न करें।

ध्यान देने वाली बात ये है कि React इन नियमों पर इतना सख्त क्यों है? क्योंकि React हुक्स के कॉल होने के आर्डर (Order of Calls) पर निर्भर करता है। अगर कोई हुक कंडीशन के कारण स्किप हो जाता है, तो React का स्टेट ट्रैकिंग सिस्टम पूरी तरह से गड़बड़ा जाता है।

---

Common Mistakes 1: useEffect में Infinite Loop का बन जाना

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

गलत तरीका (The Broken Code):

import React, { useState, useEffect } from 'react';

function BadCounter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    // बिना dependency array के, यह हर render पर चलेगा
    // और setCount फिर से render ट्रिगर करेगा, जिससे infinite loop बनेगा
    setCount(count + 1);
  });

  return (
    <div>
      <p>Count: {count}</p>
    </div>
  );
}

export default BadCounter;

सही तरीका (The Fixed Code):

इस error को ठीक करने के लिए, हमें Dependency Array का सही ढंग से उपयोग करना होगा, या फिर Functional Update का सहारा लेना होगा।

import React, { useState, useEffect } from 'react';

function GoodCounter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    // dependency array में खाली array [] देने से यह सिर्फ mount पर चलेगा
    setCount(prevCount => prevCount + 1);
  }, []); 

  return (
    <div>
      <p>Count: {count}</p>
    </div>
  );
}

export default GoodCounter;
---

Common Mistakes 2: Stale Closures (पुरानी स्टेट वैल्यू मिलना)

जब आप asynchronous ऑपरेशन्स जैसे कि setTimeout, setInterval, या event listeners का इस्तेमाल करते हैं, तो अक्सर आपको स्टेट की वैल्यू पुरानी (stale) मिलती है। ऐसा JavaScript के "Closures" के कारण होता है।

गलत तरीका (The Broken Code):

import React, { useState, useEffect } from 'react';

function StaleCounter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      // यहाँ count की वैल्यू हमेशा 0 रहेगी क्योंकि closure ने पहले render की वैल्यू कैप्चर कर ली है
      console.log("Current Count inside interval:", count);
      setCount(count + 1);
    }, 1000);

    return () => clearInterval(interval);
  }, []); // खाली array होने के कारण यह सिर्फ एक बार चलता है

  return (
    <div>
      <h1>Count: {count}</h1>
    </div>
  );
}

export default StaleCounter;

सही तरीका (The Fixed Code):

इस समस्या को हल करने के लिए, हमेशा functional state updates का उपयोग करें। यह सुनिश्चित करता है कि आपको हमेशा सबसे ताज़ा (latest) स्टेट प्राप्त हो रही है।

import React, { useState, useEffect } from 'react';

function FreshCounter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      // functional update का इस्तेमाल करके stale closure की समस्या दूर की गई
      setCount((prevCount) => {
        console.log("Fresh Count inside interval:", prevCount + 1);
        return prevCount + 1;
      });
    }, 1000);

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

  return (
    <div>
      <h1>Count: {count}</h1>
    </div>
  );
}

export default FreshCounter;
---

useEffect का लाइफसाइकल फ्लो (Execution Flow Diagram)

यह समझना बहुत महत्वपूर्ण है कि React का रेंडरिंग और इफेक्ट्स का चक्र कैसे काम करता है। नीचे दिए गए फ्लो डायग्राम को देखें:

🏗️ useEffect Lifecycle Flow
Component Rendered
Run Cleanup (if exists)
Run New Effect Logic
Wait for State Change
Diagram: React render execution flow with dependency updates in functional components.
---

Common Mistakes 3: Cleanups को भूल जाना (Memory Leaks)

जब भी आप किसी बाह्य API, सॉकेट (WebSockets), या इवेंट लिसनर्स को `useEffect` में जोड़ते हैं, तो घटक के नष्ट (unmount) होने पर उन्हें हटाना बहुत आवश्यक है। अन्यथा, बैकग्राउंड में कोड चलता रहेगा और यह आपकी एप्लीकेशन को धीमा कर देगा।

गलत तरीका (The Broken Code):

import React, { useState, useEffect } from 'react';

function BadEventListener() {
  const [windowWidth, setWindowWidth] = useState(window.innerWidth);

  useEffect(() => {
    // यहाँ इवेंट लिसनर तो जोड़ दिया गया, लेकिन अनमाउंट होने पर हटाया नहीं गया
    window.addEventListener('resize', () => {
      setWindowWidth(window.innerWidth);
    });
  }, []);

  return <p>Window Width: {windowWidth}px</p>;
}

export default BadEventListener;

सही तरीका (The Fixed Code):

import React, { useState, useEffect } from 'react';

function GoodEventListener() {
  const [windowWidth, setWindowWidth] = useState(window.innerWidth);

  useEffect(() => {
    const handleResize = () => {
      setWindowWidth(window.innerWidth);
    };

    window.addEventListener('resize', handleResize);

    // क्लीनअप फ़ंक्शन का उपयोग करके इवेंट लिसनर को हटाया गया
    return () => {
      window.removeEventListener('resize', handleResize);
    };
  }, []);

  return <p>Window Width: {windowWidth}px</p>;
}

export default GoodEventListener;
---

Performance Optimization: useMemo vs useCallback का सही चुनाव

अक्सर डेवलपर्स हर जगह बिना सोचे-समझे useMemo और useCallback का उपयोग करने लगते हैं। याद रखें, इन दोनों हुक्स की अपनी ओवरहेड कॉस्ट (computational cost) होती है। इसलिए इनका उपयोग केवल तभी करें जब वास्तव में आवश्यकता हो।

  • useMemo: यह किसी भारी कैलकुलेशन (expensive computation) के परिणाम को कैश (memoize) करने के लिए होता है।
  • useCallback: यह किसी फ़ंक्शन की परिभाषा (function definition) को री-रेंडर के दौरान कैश करने के लिए उपयोग किया जाता है।

Comparison Table: useMemo vs useCallback

Feature useMemo useCallback
क्या रिटर्न करता है? फ़ंक्शन द्वारा रिटर्न किया गया Value. पूरा का पूरा Function ही रिटर्न करता है।
मुख्य उद्देश्य (Purpose) Heavy Calculations को बार-बार चलने से रोकना। Child components में बेवजह री-रेंडरिंग रोकना।
syntax useMemo(() => computeValue(a, b), [a, b]) useCallback(() => doSomething(a), [a])
---

Step-by-Step Guide: Custom Hook कैसे बनाएं?

यदि आप अपने कोड को साफ और रियूजेबल बनाना चाहते हैं, तो Custom Hooks आपके सबसे अच्छे दोस्त हैं। चलिए, एक कस्टम हुक useFetch बनाते हैं जो किसी भी API से डेटा सुरक्षित रूप से लाने का काम करेगा और लोडिंग एवं एरर स्टेट्स को भी संभालेगा।

स्टेप 1: फ़ाइल बनाएँ

सबसे पहले अपने प्रोजेक्ट में useFetch.js नाम की एक नई फ़ाइल बनाएँ।

स्टेप 2: कस्टम हुक का लॉजिक लिखें

हम यहाँ Fetch API के साथ AbortController का इस्तेमाल करेंगे ताकि कंपोनेंट अनमाउंट होने पर नेटवर्क रिक्वेस्ट कैंसिल हो सके।

import { useState, useEffect } from 'react';

function useFetch(url) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const abortController = new AbortController();

    const fetchData = async () => {
      try {
        setLoading(true);
        const response = await fetch(url, { signal: abortController.signal });
        if (!response.ok) {
          throw new Error('Network response was not ok');
        }
        const result = await response.json();
        setData(result);
        setError(null);
      } catch (err) {
        if (err.name !== 'AbortError') {
          setError(err.message);
        }
      } finally {
        setLoading(false);
      }
    };

    fetchData();

    // cleanup function to abort fetch request
    return () => {
      abortController.abort();
    };
  }, [url]);

  return { data, loading, error };
}

export default useFetch;

स्टेप 3: मुख्य component में इस्तेमाल करें

अब इस हुक को अपने मुख्य React components में कुछ इस तरह इस्तेमाल करें:

import React from 'react';
import useFetch from './useFetch';

function UserList() {
  const { data: users, loading, error } = useFetch('https://jsonplaceholder.typicode.com/users');

  if (loading) return <p>Loading users data... Please wait.</p>;
  if (error) return <p>Something went wrong: {error}</p>;

  return (
    <div>
      <h2>Active Users List</h2>
      <ul>
        {users && users.map((user) => (
          <li key={user.id}>{user.name} - {user.email}</li>
        ))}
      </ul>
    </div>
  );
}

export default UserList;
---

तो दोस्तों, हमने आज विस्तार से सीखा कि React Hooks Best Practices Aur Common Mistakes क्या हैं और हम कैसे अपने कंपोनेंट्स को बेहतरीन तरीके से डिज़ाइन कर सकते हैं। सही dependency arrays का चयन करना, stale closures को समझना, और cleanup functions का उपयोग करना, यही वे तरीके हैं जो एक सामान्य कोडर को एक प्रो-डेवलपर से अलग करते हैं। उम्मीद है, आप अपने अगले React प्रोजेक्ट में इन सभी बेस्ट प्रैक्टिसेज का ध्यान रखेंगे और परफॉर्मेंस को नेक्स्ट लेवल पर ले जाएंगे!

---

Frequently Asked Questions (FAQs)

Q1: React Hooks को conditionals (if-else) के अंदर कॉल क्यों नहीं किया जा सकता?
React हुक्स के कॉल होने के क्रम (Order of hook calls) पर निर्भर करता है। यदि हम किसी हुक को conditional statement के अंदर डालते हैं, तो कंपोनेंट के री-रेंडर होने पर हुक्स का क्रम बदल सकता है, जिससे React इंटरनल स्टेट्स को गलत कंपोनेंट में मैप कर देता है।
Q2: Dependency Array में [] का क्या अर्थ है?
यदि आप dependency array को खाली ([]) छोड़ देते हैं, तो इसका मतलब है कि useEffect हुक केवल कंपोनेंट के 'Mount' होने (यानी स्क्रीन पर पहली बार दिखाई देने) पर ही चलेगा। यह पुराने componentDidMount की तरह व्यवहार करता है।
Q3: Stale Closures की समस्या को कैसे हल करें?
Stale closures से बचने के लिए, हमेशा useState के functional update रूप का उपयोग करें (जैसे: setCount(prev => prev + 1)) या फिर सुनिश्चित करें कि useCallbacks और useEffects की dependency array में सभी आवश्यक वेरिएबल्स शामिल हैं।
Q4: क्या हर फ़ंक्शन पर useCallback का उपयोग करना चाहिए?
बिल्कुल नहीं! useCallback का उपयोग करने की भी अपनी एक लागत होती है। इसे केवल तभी उपयोग करें जब आप उस फ़ंक्शन को किसी ऐसे चाइल्ड कंपोनेंट में प्रोप के रूप में भेज रहे हों जो React.memo का उपयोग करके ऑप्टिमाइज़ किया गया है।
Q5: custom hook बनाने का मुख्य फ़ायदा क्या है?
कस्टम हुक का सबसे बड़ा फ़ायदा यह है कि यह 'Separation of Concerns' और 'Dry Principle' (Don't Repeat Yourself) को बढ़ावा देता है। आप अपने स्टेटफुल और बिज़नेस लॉजिक को यूआई से अलग करके कई कंपोनेंट्स में आसानी से रियूज़ कर सकते हैं।

Kya yeh article helpful tha?

B
Banti KevatFounder

TechIT ka founder · M.Tech AI student · Ujjain, MP. React, AI aur coding ko simple Hindi mein sikhaata hoon taaki har student aage badh sake. 🇮🇳

Advertisement

Related ArticlesAapko yeh bhi pasand aayega

Loading...

टिप्पणियाँ

Hum aapke experience ko behtar banane ke liye cookies use karte hain. Site use karke aap hamari Privacy Policy se sehmat hain.