درود دوستان 🤚🏼 من امیررضا ریاحی هستم، نویسندهٔ جدید دیتی. امروز قراره با هم با یکی از مهم‌ترین کانسپت‌های ری‌اکت، به نام کاستوم‌ هوک‌ها آشنا بشیم و یاد بگیریم چجوری یک کاستوم هوک بسازیم و ازش استفاده کنیم. این پست از مجموعه پست‌های ری‌اکت ۱۰۱ هست که شامل مجموعه‌ای از پست‌های کوتاه و کاربردی ری‌اکتی میشه.

 

کاستوم هوک چیه ؟🧐

همونطور که از اسمش پیداست، کاستوم هوک یک هوک شخصی‌سازی و توسعه‌داده‌شده از طرف ماست که کمک می‌کنه از نوشتن کدهای تکراری جلوگیری کنیم باعث که در نتیجه برنامه‌مون رو بهینه‌تر و حرفه‌ای تر می‌کنه. کدهایی که توی یک کاستوم هوک قرار می‌گیره همون کدهای ری‌اکتی هست که توی کامپوننت‌ها می‌نویسیم. اگه توی کامپوننت‌های ما یک قطعه کد (مثل useEffect یا استیت) تکراری داریم، بهتره که اونها رو منتقل کنیم به یک فایل جدا تا به قول معروف Reusability داشته باشیم. برای اینکه ری‌اکت کدهای ما رو بشناسه، می‌بایست اونها رو در قالب یک هوک سازمان‌دهی کنیم. به این هوک‌هایی که خودمون می‌نویسیم می‌گیم Custom Hook.

 

اما چه زمانی باید کاستوم هوک بسازیم و ازش استفاده کنیم؟

بطور کلی، کاستوم هوک‌ها برای این اومدن تا ما از کد تکراری در پروژه‌هامون خودداری کنیم و حرفه‌ای‌تر کد بزنیم. ما می‌تونیم از کاستوم هوک‌ها در عملیات‌هایی مثل fetch یا در localStorage که چندین بار در برنامه از اون‌ها استفاده می‌کنیم، بهره ببریم.

 

چجوری یک کاستوم هوک بسازیم؟🤔

برای اینکه بخواید پوشه‌بندی پروژتون درست و تکمیل باشه، می‌تونید یک فولدر در پوشه src به نام hooks بسازید تا ساختار پروژتون خواناتر و درست‌تر باشه. در پوشه hooks می‌تونید کاستوم هوک‌های خودتون رو قرار بدید. یکی از استانداردهایی که هنگام ساختن هوک‌های باید اون رو رعایت کنیم اینه که اسم یک هوک می‌بایست با کلمه use شروع بشه. برای مثال usePost یا useTheme.

حالا وقتشه یک کامپوننت بسازید و کدنویسی کنید! 😎 مثال ساده یک کاستوم هوک که بررسی می‌کنه کاربر آنلاین هست یا آفلاین :

useOnlineStatus.js :

function useOnlineStatus() {
  const [isOnline, setIsOnline] = useState(true);

  useEffect(() => {
    function handleOnline() {
      setIsOnline(true);
    }

    function handleOffline() {
      setIsOnline(false);
    }

    window.addEventListener('online', handleOnline);
    window.addEventListener('offline', handleOffline);

 
    return () => {
      window.removeEventListener('online', handleOnline);
      window.removeEventListener('offline', handleOffline);
    };
  }, []);

  return isOnline;
}