درود دوستان 👋 دو تکنیک پرکاربرد بهینهسازی توی ریاکت Throttle و Debounce هستن که هر دو پیادهسازی نسبتاً شبیه به هم دارن و برای پیادهسازی قابلیتی به اسم Rate Limiting به کار میرن، اما در اصل برای هدف متفاوتی به کار میرن. توی این قسمت میخوایم Throttle رو توی ریاکت پیادهسازی کنیم. این پست از مجموعه پستهای ریاکت ۱۰۱ هست که شامل مجموعهای از پستهای کوتاه و کاربردی ریاکتی میشه.
البته قبلاً یک پست نوشتم درباره پیادهسازی این تکنیکها توی جاوااسکریپت:
Throttle چیه؟ 🤔
Throttle تضمین میکنه که کدهای ما توی یک بازه زمانی مشخص فقط یک بار اجرا بشن. مثلاً یک دکمه داریم که وقتی روی اون کلیک میشه تابعی رو اجرا میکنه. اما میخوایم کاری کنیم که کاربر توی هر ۱۰ ثانیه فقط یک بار بتونه اون رو اجرا کنه. بنابراین اگه کاربر توی بازه ۱۰ ثانیه، صد بار هم رو دکمه کلیک کنه، Throttle کمک میکنه تابع فقط یک بار اجرا بشه، و تابع برای بار دوم توی ۱۰ ثانیه بعدی قابل اجرا هست.
نکتهٔ جالبی که میخوام براتون به اشتراک بذارم، نحوهٔ کارایی قسمت «واکنش شما به این پست؟» هست که انتهای هر پست توی دیتی دیده میشه. این قسمت با استفاده از مخلوطی از دو تکنیک Throttle و Debounce پیادهسازی شده و کاربر میتونه توی بازه زمانی مشخص (۰.۵ ثانیه) فقط یک واکنش نشون بده (بخش Throttle ماجرا). و همهٔ واکنشهای کاربر ابتدا توی فرانتاند ذخیره میشه و نهایتاً زمانی به سرور ارسال میشه که بازه زمانی مشخصی از آخرین واکنش گذشته باشه (بخش Debounce ماجرا.)
قسمت جالب چیزی که براتون مطرح کردم و دوست دارم شفافسازی کنم اینه که خیلی از کاربران به من پیام دادن که این بخش باگ داره و کاربر میتونه بیشتر از یک واکنش نشون بده. اما این بخش به همین شکل پیادهسازی شده که شما بتونین چندین واکنش نشون بدین، و به قول معروف «باگ نیست، فیچره 😄»
بریم که این تکنیک رو توی ریاکت پیادهسازی کنیم.
پیادهسازی Throttle توی ریاکت
این تکنیک و همچنین Debounce رو با نوشتن یک هوک پیادهسازی خواهیم کرد، چون راحتتره. اسم این هوک رو میذاریم useThrottle که به این صورت قراره از اون توی کامپوننتها استفاده کنیم:
import { useThrottle } from "./useThrottle"; export default function App() { const throttle = <<useThrottle(1000);>> const myCallback = <<throttle>>(() => { // api call ... }); return <button onClick={myCallback}>Check</button>; }
این کامپوننت App.tsx هست که این هوک توی اون داره استفاده میشه (این کامپوننت رو بخاطر بسپارین.) توی خط ۴ ما این هوک رو پیادهسازی کردیم و عدد 1000 رو بهش پاس دادیم، به این معنی که میخوایم کالبک مد نظر ما (خط ۶) توی بازهٔ زمانی 1000 میلیثانیه (۱ ثانیه) فقط یک بار اجرا بشه. خب بریم که این هوک رو پیادهسازی کنیم.
