پیشنهاد شگفت‌انگیز سبزلرن: 50% تخفیف خرید دوره بوت استرپ
مشاهده دوره
ثانیه
دقیقه
ساعت
روز
پرسش

چطور می‌تونم از setInterval در یک اپلیکیشن React استفاده کنم؟

How can I use setInterval in a React app?

من دارم روی یه اپلیکیشن React کار می‌کنم و می‌خوام از setInterval استفاده کنم تا هر چند ثانیه یه بار یه اکشن خاص انجام بشه. اما متوجه شدم که استفاده از setInterval به طور مستقیم داخل تابع کامپوننت مشکلاتی داره، مثل اینکه تایمرها ری‌استارت می‌شن یا وقتی کامپوننت رندر مجدد می‌شه، تایمر از کار می‌افته. چطور می‌تونم به شکلی از setInterval استفاده کنم که این مشکلات پیش نیاد و عملکرد درستی داشته باشه؟

1403/06/06
پاسخ
محمدامین سعیدی راد
بیوگرافی محمدامین سعیدی راد

برای استفاده درست از setInterval در یک کامپوننت React، باید حواست باشه که چون هر بار که کامپوننت رندر می‌شه، تایمر جدیدی ایجاد می‌شه، ممکنه با مشکلاتی مثل ری‌استارت تایمر یا حتی نشت حافظه روبرو بشی. بهترین راه اینه که از useEffect به همراه clearInterval برای تمیزکاری تایمر استفاده کنی تا مطمئن بشی تایمر به درستی مدیریت می‌شه.

کد زیر یه نمونه خوب از پیاده‌سازی setInterval توی یک کامپوننت React رو نشون می‌ده:

import React, { useState, useEffect } from 'react';
function MyComponent() {
  const [count, setCount] = useState(0);
  useEffect(() => {
     // Set up the interval

     const intervalId = setInterval(() => {
     setCount(prevCount => prevCount + 1);
  }, 1000);
     return () => clearInterval(intervalId);
  }, []); 

   return (
      <div>
          <p>Count: {count}</p>
     </div>
)}
export default MyComponent;

توضیحات:

  • استفاده از useEffect: این هوک کمک می‌کنه که setInterval فقط یک بار تنظیم بشه و وقتی کامپوننت از بین می‌ره، تایمر هم به درستی پاک بشه.
  • بازگشت clearInterval: توی return تابع useEffect، ما clearInterval رو صدا می‌زنیم تا هر وقت کامپوننت از بین رفت، تایمر هم تمیز بشه و از نشت حافظه جلوگیری کنه.
  • آرایه خالی توی useEffect: این باعث می‌شه که useEffect فقط یک بار، بعد از اولین رندر اجرا بشه و تایمر دوباره تنظیم نشه.

این روش بهینه‌ترین و استانداردترین روش برای استفاده از تایمرها توی کامپوننت‌های React هست و مشکلات رایجی که ممکنه با setInterval داشته باشی رو حل می‌کنه

پاسخ: 1403/06/06
آخرین آپدیت: 1403/08/15