درود دوستان 👋 توی این قسمت می‌خوایم یاد بگیریم که چطوری یکی از پرکاربردترین تکنیک‌های بهینه‌سازی و افزایش سرعت و تجربهٔ کاربری برنامه‌های ری‌اکتی رو پیاده‌سازی کنیم. اسم این تکنیک Debounce هست. این پست از ...

 

Debounce چیه؟ 🤔

Debounce یک تکنیک بهینه‌سازی توی دنیای برنامه‌نویسی هست و فقط مختص ری‌اکت نیست. با اون می‌تونیم مطمئن بشیم که یک قطعه کد دوباره اجرا نمیشه مگر اینکه مقدار مشخصی از زمان آخرین تلاش برای اجرای اون گذشته باشه. معروف‌ترین مثال Debounce برای پیاده‌سازی جستجوی لحظه‌ای هست. ابتدا صبر می‌کنیم تا کاربر دست از تایپ کردن برداره و بعد جستجو رو شروع می‌کنیم. مثلاً می‌گیم اگه از آخرین تایپ کاربر ۱ ثانیه گذشته بود جستجو رو شروع کن. در غیر این صورت، جستجو رو به تعویق بنداز. تابع setTimeout معمولاً برای پیاده‌سازی چنین توابعی به کار میره.

این تکنیک رو قبلاً با جاوااسکریپت پیاده‌سازی کردیم. اما می‌خوایم ببینیم چطوری با قابلیت‌های ری‌اکت مثل هوک‌ها اون رو پیاده‌سازی کنیم.

 

پیاده‌سازی Debounce توی ری‌اکت

خب برای این کار همهٔ چیزی که باید انجام بدیم اینه که یک هوک بسازیم. یک هوک به اسم useDebounce که قراره به شکل زیر توی برنامه استفاده بشه:

function MyComponent() {
  const debounce = <<useDebounce(1000);>>

  const handleSearch = <<debounce(() => {>>
    // Executes after 1000ms
  });

  return (
    <input onChange={handleSearch} /> 
  );
}

کال‌بک مد نظرمون (همون کدهایی که قراره Debounce بشه) رو محصور می‌کنیم به تابعی که از هوک useDebounce ریترن میشه. هنگام پیاده‌سازی این هوک هم می‌بایست بازه زمانی مد نظرمون رو هم مشخص کنیم که اینجا گفتیم ۱۰۰۰ میلی‌ثانیه، یعنی می‌بایست از آخرین اجرای کدهای ما ۱۰۰۰ میلی‌ثانیه گذشته باشه تا بتونیم مجدد اونها رو اجرا کنیم. بریم که این هوک رو پیاده‌سازی کنیم.

ابتدا یک فایل می‌سازیم به اسم useDebounce.js و توی اون هوک رو پیاده‌سازی می‌کنیم:

export function useDebounce(delay) {
  const debounce = () => {
    // ...
  }

  return debounce;
}

اینجا یک هوک ساختیم که داره یک تابع به اسم debounce رو ریترن می‌کنه. کاری که الان باید انجام بدیم تکمیل کردن این تابع هست. این تابع می‌بایست یک HOF باشه. یعنی باید یک تابع دیگه رو قبول کنه و حالت بهینه‌سازی شدهٔ اون رو برگردونه:

export function useDebounce(delay) {
  const debounce = (callback) => {
    <<return (...args) => {>>
      // ...
      callback(...args);
    }
  }

  return debounce;
}