React-এর useLayoutEffect হুকের একটি গভীর বিশ্লেষণ, যেখানে এর সিনক্রোনাস প্রকৃতি, ব্যবহারের ক্ষেত্র, সম্ভাব্য সমস্যা এবং সেরা পারফরম্যান্সের জন্য সর্বোত্তম অনুশীলন নিয়ে আলোচনা করা হয়েছে।
React useLayoutEffect: সিনক্রোনাস DOM এফেক্ট আয়ত্ত করা
React-এর useLayoutEffect হুকটি সিনক্রোনাস DOM মিউটেশন সম্পাদনের জন্য একটি শক্তিশালী টুল। যদিও এটি useEffect-এর সাথে সাদৃশ্যপূর্ণ, পারফরম্যান্ট এবং অনুমানযোগ্য React অ্যাপ্লিকেশন তৈরির জন্য এর অনন্য বৈশিষ্ট্য এবং উপযুক্ত ব্যবহারের ক্ষেত্র বোঝা অত্যন্ত গুরুত্বপূর্ণ। এই বিস্তারিত গাইডটি useLayoutEffect-এর জটিলতাগুলি তুলে ধরে, যেখানে ব্যবহারিক উদাহরণ, এড়িয়ে চলার মতো সাধারণ ভুল এবং এর সম্ভাবনাকে সর্বাধিক করার জন্য সেরা অনুশীলনগুলি আলোচনা করা হয়েছে।
useLayoutEffect-এর সিনক্রোনাস প্রকৃতি বোঝা
useLayoutEffect এবং useEffect-এর মধ্যে মূল পার্থক্য তাদের এক্সিকিউশন টাইমিং-এর মধ্যে নিহিত। useEffect ব্রাউজার স্ক্রিনে পেইন্ট করার পরে অ্যাসিঙ্ক্রোনাসভাবে চলে, যা এমন কাজের জন্য আদর্শ যেখানে তাৎক্ষণিক DOM আপডেটের প্রয়োজন হয় না। অন্যদিকে, useLayoutEffect ব্রাউজার পেইন্ট করার আগে সিনক্রোনাসভাবে এক্সিকিউট হয়। এর মানে হলো, useLayoutEffect-এর মধ্যে করা যেকোনো DOM মিউটেশন ব্যবহারকারীর কাছে অবিলম্বে দৃশ্যমান হবে।
এই সিনক্রোনাস প্রকৃতি useLayoutEffect-কে সেই সব পরিস্থিতির জন্য অপরিহার্য করে তোলে যেখানে ব্রাউজার আপডেট করা ভিউ রেন্ডার করার আগে আপনাকে DOM লেআউট পড়তে বা পরিবর্তন করতে হবে। উদাহরণগুলির মধ্যে রয়েছে:
- একটি এলিমেন্টের মাত্রা পরিমাপ করা এবং সেই পরিমাপের উপর ভিত্তি করে অন্য একটির অবস্থান সামঞ্জস্য করা।
- DOM আপডেট করার সময় ভিজ্যুয়াল গ্লিচ বা ফ্লিকারিং প্রতিরোধ করা।
- DOM লেআউট পরিবর্তনের সাথে অ্যানিমেশন সিঙ্ক্রোনাইজ করা।
এক্সিকিউশনের ক্রম: একটি বিস্তারিত পর্যালোচনা
useLayoutEffect-এর আচরণ পুরোপুরি বোঝার জন্য, একটি React কম্পোনেন্ট আপডেটের সময় নিম্নলিখিত এক্সিকিউশন ক্রমটি বিবেচনা করুন:
- React কম্পোনেন্টের state এবং props আপডেট করে।
- React ভার্চুয়াল DOM-এ কম্পোনেন্টের নতুন আউটপুট রেন্ডার করে।
- React আসল DOM-এ প্রয়োজনীয় পরিবর্তনগুলি গণনা করে।
- useLayoutEffect সিনক্রোনাসভাবে এক্সিকিউট হয়। এখানেই আপনি DOM পড়তে এবং পরিবর্তন করতে পারেন। ব্রাউজার এখনো পেইন্ট করেনি!
- ব্রাউজার আপডেট করা DOM স্ক্রিনে পেইন্ট করে।
- useEffect পেইন্টের পরে অ্যাসিঙ্ক্রোনাসভাবে এক্সিকিউট হয়।
এই ক্রমটি DOM আপডেট এবং রেন্ডারিংয়ের সাথে সম্পর্কিত সঠিক টাইমিং প্রয়োজন এমন কাজের জন্য useLayoutEffect-এর গুরুত্ব তুলে ধরে।
useLayoutEffect-এর সাধারণ ব্যবহারের ক্ষেত্র
১. এলিমেন্ট পরিমাপ এবং পজিশনিং
একটি সাধারণ পরিস্থিতি হলো একটি এলিমেন্টের মাত্রা পরিমাপ করা এবং সেই মাত্রা ব্যবহার করে অন্য একটি এলিমেন্টকে পজিশন করা। উদাহরণস্বরূপ, একটি টুলটিপকে তার প্যারেন্ট এলিমেন্টের সাপেক্ষে পজিশন করা।
উদাহরণ: ডাইনামিক টুলটিপ পজিশনিং
কল্পনা করুন একটি টুলটিপ যা তার প্যারেন্ট এলিমেন্টের উপরে বা নীচে পজিশন করা প্রয়োজন, যা স্ক্রিনের উপলব্ধ স্থানের উপর নির্ভর করে। useLayoutEffect এর জন্য উপযুক্ত:
import React, { useState, useRef, useLayoutEffect } from 'react';
function Tooltip({ children, text }) {
const [position, setPosition] = useState('bottom');
const tooltipRef = useRef(null);
const parentRef = useRef(null);
useLayoutEffect(() => {
if (!tooltipRef.current || !parentRef.current) return;
const tooltipHeight = tooltipRef.current.offsetHeight;
const parentRect = parentRef.current.getBoundingClientRect();
const windowHeight = window.innerHeight;
if (parentRect.top + parentRect.height + tooltipHeight > windowHeight) {
setPosition('top');
} else {
setPosition('bottom');
}
}, [text]);
return (
{children}
{text}
);
}
export default Tooltip;
এই উদাহরণে, useLayoutEffect উপলব্ধ স্ক্রিন স্পেস গণনা করে এবং position স্টেট আপডেট করে, এটি নিশ্চিত করে যে টুলটিপটি ফ্লিকারিং ছাড়াই সর্বদা দৃশ্যমান থাকে। কম্পোনেন্টটি `children` (যে এলিমেন্ট টুলটিপ ট্রিগার করে) এবং `text` (টুলটিপের কনটেন্ট) গ্রহণ করে।
২. ভিজ্যুয়াল গ্লিচ প্রতিরোধ করা
কখনও কখনও, useEffect-এর মধ্যে সরাসরি DOM ম্যানিপুলেট করলে ভিজ্যুয়াল গ্লিচ বা ফ্লিকারিং হতে পারে কারণ ব্রাউজার DOM আপডেটের পরে রিপেইন্ট করে। useLayoutEffect পেইন্টের আগে পরিবর্তনগুলি প্রয়োগ করা নিশ্চিত করে এই সমস্যাটি কমাতে সাহায্য করতে পারে।
উদাহরণ: স্ক্রোল পজিশন সামঞ্জস্য করা
এমন একটি পরিস্থিতি বিবেচনা করুন যেখানে একটি কন্টেইনারের কনটেন্ট পরিবর্তন হওয়ার পরে তার স্ক্রোল পজিশন সামঞ্জস্য করতে হবে। useEffect ব্যবহার করলে সামঞ্জস্য প্রয়োগ করার আগে আসল স্ক্রোল পজিশনের একটি সংক্ষিপ্ত ফ্ল্যাশ হতে পারে। useLayoutEffect সিনক্রোনাসভাবে স্ক্রোল সামঞ্জস্য প্রয়োগ করে এটি এড়িয়ে যায়।
import React, { useRef, useLayoutEffect } from 'react';
function ScrollableContainer({ children }) {
const containerRef = useRef(null);
useLayoutEffect(() => {
if (!containerRef.current) return;
// Scroll to the bottom of the container
containerRef.current.scrollTop = containerRef.current.scrollHeight;
}, [children]); // Re-run when children change
return (
{children}
);
}
export default ScrollableContainer;
এই কোডটি নিশ্চিত করে যে ব্রাউজার পেইন্ট করার আগে স্ক্রোল পজিশন সামঞ্জস্য করা হয়েছে, যা কোনো ভিজ্যুয়াল ফ্লিকার প্রতিরোধ করে। `children` প্রপটি একটি ডিপেন্ডেন্সি হিসাবে কাজ করে, যখনই কন্টেইনারের কনটেন্ট পরিবর্তন হয় তখন এফেক্টটি ট্রিগার করে।
৩. DOM পরিবর্তনের সাথে অ্যানিমেশন সিঙ্ক্রোনাইজ করা
যখন DOM লেআউটের উপর নির্ভরশীল অ্যানিমেশনগুলির সাথে কাজ করা হয়, তখন useLayoutEffect মসৃণ এবং সিঙ্ক্রোনাইজড ট্রানজিশন নিশ্চিত করে। এটি বিশেষত কার্যকর যখন অ্যানিমেশনে এমন বৈশিষ্ট্য জড়িত থাকে যা এলিমেন্টের লেআউটকে প্রভাবিত করে, যেমন প্রস্থ, উচ্চতা বা অবস্থান।
উদাহরণ: এক্সপান্ডিং/কলাপসিং অ্যানিমেশন
ধরুন আপনি একটি কলাপসিবল প্যানেলের জন্য একটি মসৃণ এক্সপান্ডিং/কলাপসিং অ্যানিমেশন তৈরি করতে চান। height প্রপার্টিটি সঠিকভাবে অ্যানিমেট করার জন্য আপনাকে প্যানেলের কনটেন্টের উচ্চতা পরিমাপ করতে হবে। আপনি যদি useEffect ব্যবহার করেন, তাহলে অ্যানিমেশন শুরু হওয়ার আগেই উচ্চতার পরিবর্তন দৃশ্যমান হতে পারে, যার ফলে একটি ঝাঁকুনিযুক্ত ট্রানজিশন হবে।
import React, { useState, useRef, useLayoutEffect } from 'react';
function CollapsiblePanel({ children }) {
const [isExpanded, setIsExpanded] = useState(false);
const contentRef = useRef(null);
const [height, setHeight] = useState(0);
useLayoutEffect(() => {
if (!contentRef.current) return;
setHeight(isExpanded ? contentRef.current.scrollHeight : 0);
}, [isExpanded, children]);
return (
{children}
);
}
export default CollapsiblePanel;
useLayoutEffect ব্যবহার করে, ব্রাউজার পেইন্ট করার আগে উচ্চতা গণনা করে সিনক্রোনাসভাবে প্রয়োগ করা হয়, যার ফলে কোনো ভিজ্যুয়াল গ্লিচ ছাড়াই একটি মসৃণ এক্সপান্ডিং/কলাপসিং অ্যানিমেশন হয়। `isExpanded` এবং `children` প্রপগুলো প্যানেলের স্টেট বা কনটেন্ট পরিবর্তন হলে এফেক্টটি পুনরায় চালানোর জন্য ট্রিগার করে।
সম্ভাব্য সমস্যা এবং সেগুলি এড়ানোর উপায়
যদিও useLayoutEffect একটি মূল্যবান টুল, তবে এর সম্ভাব্য অসুবিধাগুলি সম্পর্কে সচেতন থাকা এবং এটি বিচক্ষণতার সাথে ব্যবহার করা অপরিহার্য।
১. পারফরম্যান্সের উপর প্রভাব: পেইন্ট ব্লক করা
যেহেতু useLayoutEffect ব্রাউজার পেইন্ট করার আগে সিনক্রোনাসভাবে চলে, এই হুকের মধ্যে দীর্ঘ সময় ধরে চলা গণনা রেন্ডারিং পাইপলাইন ব্লক করতে পারে এবং পারফরম্যান্স সমস্যা সৃষ্টি করতে পারে। এর ফলে ব্যবহারকারী ইন্টারফেসে একটি লক্ষণীয় বিলম্ব বা তোতলামি হতে পারে, বিশেষ করে ধীরগতির ডিভাইস বা জটিল DOM ম্যানিপুলেশনের ক্ষেত্রে।
সমাধান: জটিল গণনা কমানো
useLayoutEffect-এর মধ্যে গণনা-নিবিড় কাজ করা এড়িয়ে চলুন।- অ-গুরুত্বপূর্ণ DOM আপডেটগুলি
useEffect-এ স্থগিত করুন, যা অ্যাসিঙ্ক্রোনাসভাবে চলে। - আপনার কোডকে পারফরম্যান্সের জন্য অপ্টিমাইজ করুন, যেমন মেমোাইজেশন এবং দক্ষ অ্যালগরিদম ব্যবহার করে।
২. সার্ভার-সাইড রেন্ডারিং সমস্যা
useLayoutEffect DOM-এর অ্যাক্সেসের উপর নির্ভর করে, যা সার্ভার-সাইড রেন্ডারিং (SSR) এর সময় উপলব্ধ নয়। এটি সার্ভারে আপনার React অ্যাপ্লিকেশন রেন্ডার করার সময় ত্রুটি বা অপ্রত্যাশিত আচরণের কারণ হতে পারে।
সমাধান: শর্তসাপেক্ষ এক্সিকিউশন
\nশুধুমাত্র ব্রাউজার পরিবেশে শর্তসাপেক্ষে useLayoutEffect এক্সিকিউট করুন।
import { useLayoutEffect } from 'react';
function MyComponent() {
useLayoutEffect(() => {
if (typeof window !== 'undefined') {
// Access DOM here
}
}, []);
return (
{/* Component content */}
);
}
আরেকটি পদ্ধতি হলো এমন একটি লাইব্রেরি ব্যবহার করা যা একটি সার্ভার-সেফ বিকল্প প্রদান করে বা SSR-এর সময় DOM পরিবেশকে মক করার একটি উপায় দেয়।
৩. useLayoutEffect-এর উপর অতিরিক্ত নির্ভরতা
সমস্ত DOM ম্যানিপুলেশনের জন্য useLayoutEffect ব্যবহার করা লোভনীয়, তবে এটি অপ্রয়োজনীয় পারফরম্যান্স ওভারহেডের কারণ হতে পারে। মনে রাখবেন যে useEffect প্রায়শই এমন কাজের জন্য একটি ভাল পছন্দ যার জন্য সিনক্রোনাস DOM আপডেটের প্রয়োজন হয় না।
সমাধান: সঠিক হুক বেছে নিন
- ব্রাউজার পেইন্ট করার আগে এক্সিকিউট করার প্রয়োজন নেই এমন সাইড এফেক্টের জন্য
useEffectব্যবহার করুন (যেমন, ডেটা ফেচিং, ইভেন্ট লিসেনার, লগিং)। - সিনক্রোনাস DOM মিউটেশন বা রেন্ডারিংয়ের আগে DOM লেআউট পড়ার জন্য প্রয়োজনীয় কাজগুলির জন্য
useLayoutEffectসংরক্ষণ করুন।
৪. ভুল ডিপেন্ডেন্সি অ্যারে
useEffect-এর মতো, useLayoutEffect একটি ডিপেন্ডেন্সি অ্যারের উপর নির্ভর করে তা নির্ধারণ করার জন্য যে এফেক্টটি কখন পুনরায় চালানো উচিত। একটি ভুল বা অনুপস্থিত ডিপেন্ডেন্সি অ্যারে অপ্রত্যাশিত আচরণের কারণ হতে পারে, যেমন অসীম লুপ বা পুরানো মান।
সমাধান: একটি সম্পূর্ণ ডিপেন্ডেন্সি অ্যারে প্রদান করুন
- আপনার এফেক্টের যুক্তি সাবধানে বিশ্লেষণ করুন এবং এটি যে সমস্ত ভেরিয়েবলের উপর নির্ভর করে তা সনাক্ত করুন।
- ডিপেন্ডেন্সি অ্যারেতে সেই সমস্ত ভেরিয়েবল অন্তর্ভুক্ত করুন।
- যদি আপনার এফেক্ট কোনো বাহ্যিক ভেরিয়েবলের উপর নির্ভর না করে, তাহলে একটি খালি ডিপেন্ডেন্সি অ্যারে (
[]) প্রদান করুন যাতে এটি শুধুমাত্র প্রাথমিক রেন্ডারের পরে একবার চলে। - অনুপস্থিত বা ভুল ডিপেন্ডেন্সি সনাক্ত করতে ESLint প্লাগইন `eslint-plugin-react-hooks` ব্যবহার করুন।
useLayoutEffect কার্যকরভাবে ব্যবহারের জন্য সেরা অনুশীলন
useLayoutEffect-এর সর্বাধিক সুবিধা নিতে এবং সাধারণ সমস্যাগুলি এড়াতে, এই সেরা অনুশীলনগুলি অনুসরণ করুন:
১. পারফরম্যান্সকে অগ্রাধিকার দিন
useLayoutEffect-এর মধ্যে করা কাজের পরিমাণ কমান।- অ-গুরুত্বপূর্ণ কাজগুলি
useEffect-এ স্থগিত করুন। - পারফরম্যান্সের বাধাগুলি সনাক্ত করতে আপনার অ্যাপ্লিকেশন প্রোফাইল করুন এবং সেই অনুযায়ী অপ্টিমাইজ করুন।
২. সার্ভার-সাইড রেন্ডারিং সামলান
- শুধুমাত্র ব্রাউজার পরিবেশে শর্তসাপেক্ষে
useLayoutEffectএক্সিকিউট করুন। - SSR-এর সময় সার্ভার-সেফ বিকল্প ব্যবহার করুন বা DOM পরিবেশকে মক করুন।
৩. কাজের জন্য সঠিক হুক ব্যবহার করুন
- অ্যাসিঙ্ক্রোনাস সাইড এফেক্টের জন্য
useEffectবেছে নিন। - শুধুমাত্র যখন সিনক্রোনাস DOM আপডেটের প্রয়োজন হয় তখন
useLayoutEffectব্যবহার করুন।
৪. একটি সম্পূর্ণ ডিপেন্ডেন্সি অ্যারে প্রদান করুন
- আপনার এফেক্টের ডিপেন্ডেন্সিগুলি সাবধানে বিশ্লেষণ করুন।
- ডিপেন্ডেন্সি অ্যারেতে সমস্ত প্রাসঙ্গিক ভেরিয়েবল অন্তর্ভুক্ত করুন।
- অনুপস্থিত বা ভুল ডিপেন্ডেন্সি ধরতে ESLint ব্যবহার করুন।
৫. আপনার উদ্দেশ্য ডকুমেন্ট করুন
আপনার কোডে প্রতিটি useLayoutEffect হুকের উদ্দেশ্য স্পষ্টভাবে ডকুমেন্ট করুন। ব্যাখ্যা করুন কেন সিনক্রোনাসভাবে DOM ম্যানিপুলেশন করা প্রয়োজন এবং এটি কম্পোনেন্টের সামগ্রিক কার্যকারিতায় কীভাবে অবদান রাখে। এটি আপনার কোড বোঝা এবং রক্ষণাবেক্ষণ করা সহজ করে তুলবে।
৬. পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন
আপনার useLayoutEffect হুকগুলি সঠিকভাবে কাজ করছে কিনা তা যাচাই করার জন্য ইউনিট টেস্ট লিখুন। বিভিন্ন পরিস্থিতি এবং এজ কেস পরীক্ষা করুন যাতে আপনার কম্পোনেন্ট বিভিন্ন অবস্থার অধীনে প্রত্যাশিতভাবে আচরণ করে। এটি আপনাকে তাড়াতাড়ি বাগ ধরতে এবং ভবিষ্যতে রিগ্রেশন প্রতিরোধ করতে সাহায্য করবে।
useLayoutEffect বনাম useEffect: একটি দ্রুত তুলনামূলক সারণী
| বৈশিষ্ট্য | useLayoutEffect | useEffect |
|---|---|---|
| এক্সিকিউশন টাইমিং | ব্রাউজার পেইন্ট করার আগে সিনক্রোনাসভাবে | ব্রাউজার পেইন্ট করার পরে অ্যাসিঙ্ক্রোনাসভাবে |
| উদ্দেশ্য | রেন্ডারিংয়ের আগে DOM লেআউট পড়া/পরিবর্তন করা | সাইড এফেক্ট সম্পাদন করা যার জন্য তাৎক্ষণিক DOM আপডেটের প্রয়োজন নেই |
| পারফরম্যান্সের উপর প্রভাব | অতিরিক্ত ব্যবহারে রেন্ডারিং পাইপলাইন ব্লক করতে পারে | রেন্ডারিং পারফরম্যান্সের উপর ন্যূনতম প্রভাব |
| সার্ভার-সাইড রেন্ডারিং | শর্তসাপেক্ষ এক্সিকিউশন বা সার্ভার-সেফ বিকল্পের প্রয়োজন | সাধারণত সার্ভার-সাইড রেন্ডারিংয়ের জন্য নিরাপদ |
বাস্তব-বিশ্বের উদাহরণ: বিশ্বব্যাপী অ্যাপ্লিকেশন
useLayoutEffect কার্যকরভাবে ব্যবহারের নীতিগুলি বিভিন্ন আন্তর্জাতিক প্রেক্ষাপটে প্রযোজ্য। এখানে কিছু উদাহরণ দেওয়া হলো:
- আন্তর্জাতিক UI: বিভিন্ন ভাষার অনূদিত টেক্সট লেবেলের দৈর্ঘ্যের উপর ভিত্তি করে UI এলিমেন্টগুলির লেআউট ডাইনামিকভাবে সামঞ্জস্য করা (যেমন, জার্মান লেবেলের জন্য প্রায়শই ইংরেজির চেয়ে বেশি জায়গা প্রয়োজন)।
useLayoutEffectনিশ্চিত করতে পারে যে ব্যবহারকারী UI দেখার আগেই লেআউটটি সঠিকভাবে অভিযোজিত হয়েছে। - ডান-থেকে-বামে (RTL) লেআউট: RTL ভাষায় (যেমন, আরবি, হিব্রু) এলিমেন্টগুলির সঠিক অবস্থান নির্ধারণ করা যেখানে ভিজ্যুয়াল ফ্লো বিপরীত হয়।
useLayoutEffectব্রাউজার পৃষ্ঠাটি রেন্ডার করার আগে সঠিক অবস্থান গণনা এবং প্রয়োগ করতে ব্যবহার করা যেতে পারে। - বিভিন্ন ডিভাইসের জন্য অ্যাডাপ্টিভ লেআউট: বিভিন্ন অঞ্চলে ব্যবহৃত বিভিন্ন ডিভাইসের স্ক্রিন আকারের উপর ভিত্তি করে এলিমেন্টগুলির আকার এবং অবস্থান সামঞ্জস্য করা (যেমন, কিছু উন্নয়নশীল দেশে ছোট স্ক্রিন বেশি প্রচলিত)।
useLayoutEffectনিশ্চিত করে যে UI ডিভাইসের মাত্রার সাথে সঠিকভাবে অভিযোজিত হয়। - অ্যাক্সেসিবিলিটি বিবেচনা: দৃষ্টি প্রতিবন্ধী ব্যবহারকারীদের জন্য এলিমেন্টগুলি সঠিকভাবে অবস্থান এবং আকারযুক্ত করা হয়েছে কিনা তা নিশ্চিত করা, যারা স্ক্রিন রিডার বা অন্যান্য সহায়ক প্রযুক্তি ব্যবহার করতে পারেন।
useLayoutEffectঅ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলির সাথে DOM আপডেটগুলি সিঙ্ক্রোনাইজ করতে সাহায্য করতে পারে।
উপসংহার
useLayoutEffect React ডেভেলপারের অস্ত্রাগারে একটি মূল্যবান টুল, যা DOM আপডেট এবং রেন্ডারিংয়ের উপর সুনির্দিষ্ট নিয়ন্ত্রণ সক্ষম করে। এর সিনক্রোনাস প্রকৃতি, সম্ভাব্য সমস্যা এবং সেরা অনুশীলনগুলি বোঝার মাধ্যমে, আপনি পারফরম্যান্ট, দৃশ্যত আকর্ষণীয় এবং বিশ্বব্যাপী অ্যাক্সেসযোগ্য React অ্যাপ্লিকেশন তৈরি করতে এর শক্তিকে কাজে লাগাতে পারেন। পারফরম্যান্সকে অগ্রাধিকার দিতে, সার্ভার-সাইড রেন্ডারিং সাবধানে পরিচালনা করতে, কাজের জন্য সঠিক হুক বেছে নিতে এবং সর্বদা একটি সম্পূর্ণ ডিপেন্ডেন্সি অ্যারে প্রদান করতে মনে রাখবেন। এই নির্দেশিকাগুলি অনুসরণ করে, আপনি useLayoutEffect আয়ত্ত করতে এবং ব্যতিক্রমী ব্যবহারকারীর অভিজ্ঞতা তৈরি করতে পারবেন।