فرق بین useState با useRef در React چیست؟
تفاوتهای اصلی
رندر مجدد
بزرگترین تفاوت بین useState و useRef این است که استفاده از useState باعث رندر مجدد کامپوننت میشود، در حالی که useRef چنین تاثیری ندارد. وقتی که یک وضعیت با useState تغییر کند، کامپوننت دوباره رندر میشود و این ممکن است برای عملکردهای خاصی که نیازی به رندر مجدد ندارند، کار را پیچیده کند.
تغییرات همزمان
تنظیم مقدار در useRef به صورت همزمان (synchronous) انجام میشود، در حالی که تغییر در useState به صورت غیرهمزمان (asynchronous) میباشد. این مهم است زیرا ممکن است در سناریو هایی خاص نیاز داشته باشید که از حالت همزمان استفاده کنید، مانند جلوگیری از ایجاد حلقههای بینهایت در زمان استفاده از متدهایی که به state وابسته هستند.
نگهداری دادهها
هر دو useState و useRef میتوانند دادهها را پس از رندرهای مجدد نگهداری کنند اما با رفتارهای متفاوت. به طور مثال، وقتی که از useState برای نگهداری یک شمارنده استفاده میکنید، هر بار که روی دکمه کلیک میشود، کامپوننت دوباره رندر میشود و مقدار شمارنده به روز میشود. از طرف دیگر، با useRef، میتوان مقدار شمارنده را به روز کرد بدون اینکه کامپوننت دوباره رندر شود.
سناریوهای خاص
- اگر متغیری دارید که فقط میخواهید وضعیت آن را پیگیری کنید و لازم نیست که تغییر آن موجب ری رندر بشود، بهتر است از
useRefاستفاده کنید. - در مقابل، اگر متغیری دارید که تغییر آن باید باعث تغییر در UI شود (مانند یک شمارنده)، باید از
useStateاستفاده کنید.
مثالها
به عنوان یک مثال، فرض کنید میخواهید یک تایمر داشته باشید:
با useRef:
function Timer() {
const intervalRef = useRef();
useEffect(() => {
const id = setInterval(() => {
// ...
});
intervalRef.current = id;
return () => {
clearInterval(intervalRef.current);
};
});
// ...
}
با useState:
function Timer() {
const [intervalId, setIntervalId] = useState(null);
useEffect(() => {
const id = setInterval(() => {
// ...
});
setIntervalId(id);
return () => {
clearInterval(intervalId);
};
});
// ...
}