React Academy · पाठ

useLayoutEffect से DOM तत्वों को मापना

झिलमिलाहट से बचने के लिए लेआउट के बाद और पेंट से पहले तत्वों के आयाम, स्थिति और स्क्रॉल ऑफ़सेट पढ़ें

पाठ 3, कुल 4 में से13 चरण

useLayoutEffect से DOM तत्वों को मापना, CoddyKit पर React Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह React Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। React Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

getBoundingClientRect का परिचय

element.getBoundingClientRect() एक DOMRect ऑब्जेक्ट लौटाता है, जिसमें व्यूपोर्ट के सापेक्ष तत्व का आकार और स्थिति होती है: top, right, bottom, left, width और height। सटीक मान लौटाने के लिए यह ब्राउज़र को लेआउट की गणना करने के लिए बाध्य करता है, इसलिए इसे कम ही चलाएँ।

useEffect में पढ़ने की समस्या

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

useLayoutEffect इस समस्या को कैसे हल करता है

useLayoutEffect में माप पढ़ना DOM में बदलावों के बाद, लेकिन पेंट से पहले होता है। माप के कारण होने वाला कोई भी स्थिति अपडेट React को समकालिक रूप से दोबारा रेंडर करने और सही किया हुआ DOM कमिट करने के लिए प्रेरित करता है—यह सब ब्राउज़र के कुछ भी पेंट करने से पहले होता है। उपयोगकर्ता को एक ही पेंट चक्र में केवल अंतिम, सही परिणाम दिखाई देता है।

टूलटिप की स्थिति तय करना

टूलटिप को उसे सक्रिय करने वाले तत्व के पास दिखाई देना चाहिए। useLayoutEffect में getBoundingClientRect() का उपयोग करके सक्रिय करने वाले तत्व की स्थिति मापें, टूलटिप की निरपेक्ष स्थिति निकालें और उस स्थिति को स्थिति में सेट करें। टूलटिप पहले ही पेंट पर सही स्थान पर रेंडर होती है और गलत प्रारंभिक स्थिति से होने वाली कोई दिखाई देने वाली छलाँग नहीं आती।

तत्व का ऐनिमेशन: प्रारंभिक आकार पढ़ना

किसी तत्व को उसके स्वाभाविक (बिना किसी सीमा वाले) आकार से निश्चित आकार तक ऐनिमेट करने के लिए, सीमा लागू करने से पहले उसका स्वाभाविक आकार जानना आवश्यक है। useLayoutEffect में ऐनिमेशन शैली लागू होने से पहले तत्व की ऊँचाई पढ़ें, उसे स्थिति में रखें और फिर उसे अपने CSS ट्रांज़िशन के शुरुआती कीफ़्रेम मान के रूप में उपयोग करें।

स्टिकी हेडर की ऊँचाई

जब किसी पृष्ठ में स्टिकी हेडर होता है, तो उसके पीछे छिपने से बचाने के लिए मुख्य सामग्री में हेडर की ऊँचाई के बराबर ऊपर की पैडिंग होनी चाहिए। रेफ़ का उपयोग करके useLayoutEffect में हेडर की ऊँचाई मापें: headerRef.current.getBoundingClientRect().height। इसे सामग्री कंटेनर पर paddingTop के रूप में सेट करें। लेआउट पहले रेंडर से ही सही रहेगा।

स्थिति अपडेट से समकालिक रूप से दोबारा रेंडर होता है

जब आप useLayoutEffect के अंदर setState कॉल करते हैं, तो React उसी समकालिक कार्य-खंड में तुरंत एक और रेंडर और कमिट चक्र चलाता है। इस दोबारा रेंडर में उसका useLayoutEffect भी चलता है। सावधान रहें कि असीमित लूप न बने: स्थिति को तभी अपडेट करें जब नया माप वर्तमान स्थिति मान से अलग हो।

SSR: माप का परिणाम शून्य

सर्वर पर DOM तत्व मौजूद नहीं होते, इसलिए getBoundingClientRect() त्रुटि उत्पन्न कर सकता है या शून्य मान लौटा सकता है। अपने useLayoutEffect में यह जाँच लगाएँ: if (typeof window === 'undefined') return;। SSR ऐप्स के लिए आपको स्थानापन्न आकार के साथ हाइड्रेट करना पड़ सकता है और क्लाइंट पर हाइड्रेशन के बाद माप लेना पड़ सकता है।

लगातार निगरानी के लिए ResizeObserver

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

अनावश्यक माप से बचना

यदि कई इफ़ेक्ट्स को एक ही माप की आवश्यकता हो, तो उसे एक बार निकालकर संदर्भ के माध्यम से साझा करें या प्रॉप्स के रूप में आगे भेजें। कई useLayoutEffect कॉल्स में एक ही getBoundingClientRect() मान निकालने से कई समकालिक लेआउट-पठन होते हैं, जिनमें से हर एक अपेक्षाकृत महँगा होता है। जहाँ संभव हो, मापों को एकत्रित करें।

useLayoutEffect के साथ रेफ़ का समय

इफ़ेक्ट्स चलने से पहले रेफ़्स DOM तत्वों से जोड़ दिए जाते हैं। जब useLayoutEffect चलता है, तब ref.current के DOM तत्व की ओर संकेत करने की गारंटी होती है। यही कारण है कि यह तरीका काम करता है: useLayoutEffect(() => { const rect = ref.current.getBoundingClientRect(); ... }, [])। माउंट किए गए कंपोनेंट के लेआउट इफ़ेक्ट के अंदर रेफ़ कभी अशून्य नहीं होता।

getBoundingClientRect का समय

getBoundingClientRect() को useEffect के बजाय useLayoutEffect में कॉल करना बेहतर क्यों है?

पाठ का पुनरावलोकन: DOM तत्वों को मापना

बदलावों के बाद लेकिन पेंट से पहले DOM का माप पढ़ने के लिए useLayoutEffect में getBoundingClientRect() का उपयोग करें। इन मापों से होने वाले स्थिति अपडेट उसी पेंट में शामिल समकालिक दोबारा रेंडर कराते हैं और झिलमिलाहट रोकते हैं। typeof window जाँच के साथ SSR से सुरक्षा करें। लगातार आकार की निगरानी के लिए ResizeObserver को प्राथमिकता दें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ React सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
88
पाठ
324

अक्सर पूछे जाने वाले प्रश्न

क्या “useLayoutEffect से DOM तत्वों को मापना” पाठ निःशुल्क है?

हाँ—“useLayoutEffect से DOM तत्वों को मापना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और React Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। React Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“useLayoutEffect से DOM तत्वों को मापना” में मैं क्या सीखूँगा?

झिलमिलाहट से बचने के लिए लेआउट के बाद और पेंट से पहले तत्वों के आयाम, स्थिति और स्क्रॉल ऑफ़सेट पढ़ें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ React Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या React Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर React Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“useLayoutEffect से DOM तत्वों को मापना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस React Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर React Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. रेंडरिंग चरण और DOM कमिट
  2. useLayoutEffect बनाम useEffect कब चलता है
  3. useLayoutEffect से DOM तत्वों को मापना
  4. लेआउट थ्रैश और दृश्य झिलमिलाहट से बचना
← React Academy पर वापस जाएँ