هوکهای داخلی ریاکت
هوکها به شما اجازه میدهند از ویژگیهای مختلف ریاکت در کامپوننتهای خود استفاده کنید. شما میتوانید از هوکهای داخلی استفاده کنید یا آنها را ترکیب کنید تا هوکهای مخصوص خود را بسازید. این صفحه لیست تمام هوکهای داخلی در ریاکت را نمایش میدهد.
هوکهای State
State به یک کامپوننت اجازه میدهد اطلاعاتی مانند ورودی کاربر را “به خاطر بسپارد.” برای مثال، یک کامپوننت فرم میتواند از state برای ذخیره مقدار ورودی استفاده کند، در حالی که یک گالری تصاویر میتواند از state برای ذخیره شاخص عکس انتخابی استفاده کند.
برای افزودن state به یک کامپوننت، از یکی از این هوکها استفاده کنید:
useState
یک متغیر state اعلام میکند که میتوانید مستقیماً آن را بهروزرسانی کنید.useReducer
یک متغیر state اعلام میکند که منطق بهروزرسانی آن درون تابع reducer قرار دارد.
function ImageGallery() {
const [index, setIndex] = useState(0);
// ...
هوکهای Context
Context به یک کامپوننت اجازه میدهد اطلاعاتی از والدین دور دریافت کند بدون اینکه آن ها را به عنوان props ارسال کند. برای مثال، کامپوننت سطح بالای برنامه شما میتواند تم فعلی رابط کاربری را به تمام کامپوننتهای زیرین ارسال کند، مهم نیست چقدر عمیق باشند.
useContext
یک context را میخواند و به آن اشتراک میدهد.
function Button() {
const theme = useContext(ThemeContext);
// ...
هوکهای Ref
Ref ها به یک کامپوننت اجازه میدهند اطلاعاتی را نگهداری کنند که برای رندرینگ استفاده نمیشوند، مانند یک نود DOM یا یک شناسه تایماوت. بر خلاف state، بهروزرسانی یک ref کامپوننت شما را مجدداً رندر نمیکند. Ref ها یک “راه خروج” از پارادایم ریاکت هستند. آنها زمانی مفید هستند که نیاز به کار با سیستمهای غیر ریاکتی داشته باشید، مانند APIهای مرورگر داخلی.
useRef
یک ref اعلام میکند. شما میتوانید هر مقداری را در آن نگه دارید، اما اغلب برای نگهداری یک نود DOM استفاده میشود.useImperativeHandle
به شما اجازه میدهد refی را که توسط کامپوننت شما نمایش داده میشود سفارشی کنید. این به ندرت استفاده میشود.
function Form() {
const inputRef = useRef(null);
// ...
هوکهای Effect
Effect ها به یک کامپوننت اجازه میدهند با سیستمهای خارجی ارتباط برقرار کرده و همگام شوند. این شامل مدیریت شبکه، DOM مرورگر، انیمیشنها، ویجتهای نوشته شده با کتابخانههای رابط کاربری مختلف و دیگر کدهای غیر ریاکتی میشود.
useEffect
یک کامپوننت را به یک سیستم خارجی متصل میکند.
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]);
// ...
Effect ها یک “راه خروج” از پارادایم ریاکت هستند. از Effect ها برای مدیریت جریان دادههای برنامه خود استفاده نکنید. اگر با سیستم خارجی ارتباط ندارید، ممکن است نیازی به Effect نداشته باشید.
دو نوع استفاده نادر از useEffect
وجود دارد که تفاوتهایی در زمانبندی دارند:
useLayoutEffect
قبل از اینکه مرورگر صفحه را بازپخش کند، اجرا میشود. شما میتوانید در اینجا layout را اندازهگیری کنید.useInsertionEffect
قبل از اینکه ریاکت تغییراتی در DOM ایجاد کند، اجرا میشود. کتابخانهها میتوانند در این مرحله CSS دینامیک را درج کنند.
هوکهای Performance
یک روش معمول برای بهینهسازی عملکرد رندرینگ، پرهیز از کارهای غیر ضروری است. برای مثال، شما میتوانید به ریاکت بگویید که از یک محاسبه کش شده استفاده کند یا اگر دادهها از آخرین رندر تغییر نکردهاند، رندر را پرش کند.
برای پرهیز از محاسبات و رندرینگهای غیر ضروری، از یکی از این هوکها استفاده کنید:
useMemo
به شما اجازه میدهد نتیجه یک محاسبه پرهزینه را کش کنید.useCallback
به شما اجازه میدهد تعریف یک تابع را قبل از ارسال آن به یک کامپوننت بهینهسازی شده کش کنید.
function TodoList({ todos, tab, theme }) {
const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]);
// ...
}
گاهی اوقات، شما نمیتوانید رندرینگ را پرش کنید زیرا صفحه واقعاً نیاز به بهروزرسانی دارد. در این صورت، شما میتوانید عملکرد را با جدا کردن بهروزرسانیهای مسدودکننده که باید همگام باشند (مانند تایپ کردن درون یک ورودی) از بهروزرسانیهای غیر مسدودکننده که نیاز به مسدود کردن رابط کاربری ندارند (مانند بهروزرسانی یک نمودار)، بهبود بخشید.
برای اولویتبندی رندرینگ، از یکی از این هوکها استفاده کنید:
useTransition
به شما اجازه میدهد یک تغییر حالت را غیر مسدودکننده علامتگذاری کرده و اجازه دهید بهروزرسانیهای دیگر آن را قطع کنند.useDeferredValue
به شما اجازه میدهد بهروزرسانی قسمت غیر حیاتی رابط کاربری را به تأخیر بیاندازید و اجازه دهید بخشهای دیگر ابتدا بهروزرسانی شوند.
هوکهای Resource
Resource ها میتوانند توسط یک کامپوننت بدون اینکه بخشی از state آنها باشند مورد استفاده قرار گیرند. برای مثال، یک کامپوننت میتواند یک پیام را از یک Promise بخواند یا اطلاعات استایل را از یک context بخواند.
برای خواندن یک مقدار از یک منبع، از این هوک استفاده کنید:
function MessageComponent({ messagePromise }) {
const message = use(messagePromise);
const theme = use(ThemeContext);
// ...
}
سایر هوکها
این هوکها بیشتر برای نویسندگان کتابخانه مفید هستند و بهطور معمول در کد برنامه استفاده نمیشوند.
useDebugValue
به شما اجازه میدهد برچسب خود را برای هوک مخصوص خود در DevTools ریاکت سفارشی کنید.useId
به یک کامپوننت اجازه میدهد یک ID یکتایی با خود داشته باشد. معمولاً با APIهای دسترسی پذیری استفاده میشود.useSyncExternalStore
به یک کامپوننت اجازه میدهد به یک فروشگاه خارجی مشترک شود.
هوکهای مخصوص خودتان
شما همچنین میتوانید هوکهای سفارشی خود را به عنوان توابع JavaScript تعریف کنید.