दोनों प्रभाव चलाते हैं, लेकिन ब्राउज़र पेंट के सापेक्ष विभिन्न क्षणों पर — और यह समय अंतर पूरा मुद्दा है।
- ब्राउज़र के पेंट करने के चलता है। यह asynchronous और non-blocking है। इसे लगभग सब कुछ के लिए उपयोग करें (डेटा, सदस्यता, लॉगिंग)।
दोनों प्रभाव चलाते हैं, लेकिन ब्राउज़र पेंट के सापेक्ष विभिन्न क्षणों पर — और यह समय अंतर पूरा मुद्दा है।
useEffectuseLayoutEffect DOM के mutation के बाद लेकिन ब्राउज़र के पेंट करने से पहले synchronously चलता है। इसका उपयोग तब करें जब आपको layout पढ़ना और DOM को दिखाई देने वाली flicker से बचने के लिए एक ही frame में बदलना हो।render → DOM updated → [useLayoutEffect runs] → browser paints → [useEffect runs]
कल्पना करें कि एक element को measure कर रहे हैं और इसके आकार के आधार पर एक tooltip को reposition कर रहे हैं। useEffect के साथ, उपयोगकर्ता को tooltip गलत जगह पर संक्षेप में दिखाई देगा, फिर यह jump करता है:
useLayoutEffect(() => {
const { height } = ref.current.getBoundingClientRect();
setTooltipTop(-height); // applied BEFORE paint → no visible jump
}, []);
useEffect के साथ, वही code paint के बाद चलता है → एक-frame flicker।
useLayoutEffect में heavy काम UI को janky महसूस कराता है, क्योंकि ब्राउज़र पेंट नहीं कर सकता जब तक यह समाप्त न हो जाए।अंगूठा नियम: default से useEffect; केवल synchronous DOM measurements/mutations के लिए useLayoutEffect का उपयोग करें जो अन्यथा flicker करेंगे।
विस्तृत उत्तरों के साथ IT इंटरव्यू प्रश्नों की एक लाइब्रेरी — जूनियर से सीनियर तक।
दान करें