উভয়ই effects চালায়, কিন্তু ব্রাউজার পেইন্টের সাপেক্ষে বিভিন্ন সময়ে — এবং এই টাইমিং পার্থক্যই সম্পূর্ণ বিষয়।
- ব্রাউজার পেইন্ট করার চলে। এটি অ্যাসিঙ্ক্রোনাস এবং নন-ব্লকিং। প্রায় সবকিছুর জন্য এটি ব্যবহার করুন (ডেটা, সাবস্ক্রিপশন, লগিং)।
উভয়ই effects চালায়, কিন্তু ব্রাউজার পেইন্টের সাপেক্ষে বিভিন্ন সময়ে — এবং এই টাইমিং পার্থক্যই সম্পূর্ণ বিষয়।
useEffectuseLayoutEffect DOM পরিবর্তনের পরে কিন্তু ব্রাউজার পেইন্ট করার আগে সিঙ্ক্রোনাসভাবে চলে। যখন আপনাকে লেআউট পড়তে হবে এবং একই ফ্রেমে DOM পরিবর্তন করতে হবে একটি দৃশ্যমান ফ্লিকার এড়ানোর জন্য তখন এটি ব্যবহার করুন।render → DOM updated → [useLayoutEffect runs] → browser paints → [useEffect runs]
কল্পনা করুন একটি উপাদান পরিমাপ করছেন এবং এর আকারের উপর ভিত্তি করে একটি টুলটিপ পুনঃঅবস্থান করছেন। useEffect দিয়ে, ব্যবহারকারী টুলটিপটি ভুল জায়গায় সংক্ষিপ্তভাবে দেখবেন, তারপর এটি লাফিয়ে যায়:
useLayoutEffect(() => {
const { height } = ref.current.getBoundingClientRect();
setTooltipTop(-height); // applied BEFORE paint → no visible jump
}, []);
useEffect দিয়ে, একই কোড পেইন্টের পরে চলে → একটি এক-ফ্রেম ফ্লিকার।
useLayoutEffect এ ভারী কাজ UI কে ঝাঁঝাঁকে তোলে, কারণ ব্রাউজার এটি শেষ না হওয়া পর্যন্ত পেইন্ট করতে পারে না।অভিজ্ঞতার নিয়ম: ডিফল্টভাবে useEffect ব্যবহার করুন; শুধুমাত্র useLayoutEffect ব্যবহার করুন সিঙ্ক্রোনাস DOM পরিমাপ/মিউটেশনের জন্য যা অন্যথায় ফ্লিকার করবে।
বিস্তারিত উত্তরসহ IT ইন্টারভিউ প্রশ্নের একটি লাইব্রেরি — জুনিয়র থেকে সিনিয়র পর্যন্ত।
দান করুন