ویژگی تصویر

قلاب useCallback در React

  /  React   /  قلاب useCallback در React
بنر تبلیغاتی الف
فریمورک react - کتابخانه react

در این بخش به بررسی قلاب useCallback در React می پردازیم، یکی از ویژگی‌های قدرتمند React برای توسعه‌دهندگان، مدیریت بهینه‌ی وضعیت و رفتار کامپوننت‌ها است. یکی از ابزارهایی که React برای بهینه‌سازی عملکرد کامپوننت‌ها در اختیار ما قرار می‌دهد، قلاب useCallback است. این قلاب به ما کمک می‌کند تا با کنترل بهتر بر روی توابع بازگشتی (callback functions)، از رندرهای غیرضروری جلوگیری کنیم و عملکرد برنامه را بهبود ببخشیم.

در برنامه‌های React، توابع معمولاً به عنوان پراپ (prop) به کامپوننت‌های فرزند ارسال می‌شوند. این توابع ممکن است به ازای هر بار رندر شدن والد، دوباره تعریف شوند و حتی اگر تغییری در منطق تابع یا کامپوننت فرزند رخ نداده باشد، باعث رندر مجدد کامپوننت‌های فرزند شوند. useCallback راه‌حلی ساده و مؤثر برای جلوگیری از این مشکل است. در این مقاله، با مفهوم، کاربردها و جزئیات قلاب useCallback آشنا خواهیم شد و نحوه استفاده از آن را با مثال‌های عملی بررسی خواهیم کرد.

useCallback چیست و چرا باید از آن استفاده کنیم؟

useCallback یک قلاب (hook) در React است که برای بازگرداندن یک نسخه ثابت از یک تابع به کار می‌رود. این قلاب تضمین می‌کند که تا زمانی که وابستگی‌های تابع تغییری نکنند، مرجع (reference) تابع تغییری نخواهد کرد.

چرا استفاده از useCallback مهم است؟

  • کاهش رندرهای غیرضروری: توابع جدیدی که در هر رندر تولید می‌شوند، می‌توانند باعث شوند که کامپوننت‌های فرزند بدون دلیل موجه دوباره رندر شوند.
  • کاهش مصرف منابع: اگر تابع بازگشتی شما درون یک محاسبه پیچیده یا سنگین قرار داشته باشد، استفاده از useCallback می‌تواند از اجرای مکرر آن جلوگیری کند.
  • بهبود خوانایی و عملکرد کد: کدی که بهینه باشد، اغلب ساده‌تر و قابل پیش‌بینی‌تر است.

سینتکس useCallback

const memoizedCallback = useCallback(() => {
// عملیات موردنظر
}, [dependencies]);

پارامتر اول تابعی است که باید بازگردانده شود و پارامتر دوم آرایه‌ای از وابستگی‌هایی است که تغییر آن‌ها باعث تولید نسخه جدید تابع خواهد شد.

تفاوت useCallback و useMemo

ممکن است این سؤال پیش بیاید که useCallback چه تفاوتی با useMemo دارد. درحالی‌که هر دو قلاب برای بهینه‌سازی استفاده می‌شوند، تفاوت اصلی آن‌ها در نوع مقداری است که بازمی‌گردانند:

  • useCallback: برای حفظ مرجع یک تابع استفاده می‌شود.
  • useMemo: برای حفظ نتیجه یک محاسبه استفاده می‌شود.

مثال:

const memoizedValue = useMemo(() => expensiveCalculation(a, b), [a, b]); // نتیجه محاسبه
const memoizedCallback = useCallback(() => doSomething(c), [c]); // مرجع تابع

مثال عملی از useCallback

بیایید مثالی را بررسی کنیم که نشان می‌دهد چگونه useCallback می‌تواند از رندرهای غیرضروری جلوگیری کند.

مثال بدون useCallback

تماشا در حالت تمام صفحه

در مثال بالا، هر بار که شمارنده افزایش می‌یابد، تابع handleClick دوباره تعریف شده و کامپوننت فرزند (Child) دوباره رندر می‌شود.

استفاده از useCallback

تماشا در حالت تمام صفحه

در اینجا، تابع handleClick تنها یک بار تعریف شده و تا زمانی که وابستگی‌های آن تغییر نکنند، کامپوننت فرزند دوباره رندر نمی‌شود.

موارد استفاده از useCallback

۱. جلوگیری از رندر غیرضروری در کامپوننت‌های فرزند

همان‌طور که در مثال بالا مشاهده شد، زمانی که کامپوننت فرزند نیازمند مرجع ثابت یک تابع باشد، استفاده از useCallback ضروری است.

۲. بهینه‌سازی توابع سنگین

اگر تابع شما شامل محاسبات سنگین است، می‌توانید با useCallback آن را تنها زمانی که ضروری است بازتعریف کنید.

۳. استفاده با React.memo

useCallback اغلب همراه با React.memo استفاده می‌شود. React.memo از رندر غیرضروری کامپوننت‌های فرزند جلوگیری می‌کند، اما تنها زمانی مؤثر است که پراپ‌های ورودی تغییر نکنند. useCallback تضمین می‌کند که مرجع توابع تغییر نمی‌کند.

چالش‌ها و نکات کلیدی

۱. استفاده بیش از حد

اگر از useCallback در جایی که نیازی نیست استفاده کنید، کد شما پیچیده‌تر خواهد شد بدون اینکه مزیت عملکردی خاصی به دست بیاورید. برای مثال، در برنامه‌های کوچک ممکن است استفاده از آن غیرضروری باشد.

۲. وابستگی‌ها را مدیریت کنید

همیشه مطمئن شوید که آرایه وابستگی‌ها کامل است. عدم دقت در این مورد می‌تواند منجر به رفتارهای غیرمنتظره شود.

۳. ترکیب با سایر قلاب‌ها

useCallback می‌تواند همراه با useReducer، useContext و دیگر قلاب‌ها استفاده شود. بهینه‌سازی عملکرد در این ترکیب‌ها می‌تواند بسیار مؤثر باشد.

قلاب useCallback یکی از ابزارهای بسیار مفید در React برای بهینه‌سازی کامپوننت‌ها و مدیریت منابع است. با استفاده درست از آن، می‌توان رندرهای غیرضروری را کاهش داد و کدی قابل اعتمادتر و مؤثرتر نوشت. با این حال، باید از آن به صورت هوشمندانه و فقط در صورت نیاز استفاده کرد.

منابع

آیا این مطلب برای شما مفید بود ؟

خیر
بله
بنر تبلیغاتی ج