الخطافات في React دوال تبدأ أسماؤها بـ use تتيح لمكوّن الدالة استخدام ميزات React: useState لتذكّر قيمة، وuseEffect لتشغيل كود بعد العرض، وuseRef للاحتفاظ بعقدة DOM، وuseContext لقراءة بيانات مشتركة. تستدعيها في أعلى مكوّنك، وتحتفظ React بقيمها بين مرات العرض.
أربعة خطافات تعمل معًا هنا. يخزن useState النص، ويشير useRef إلى الحقل ليتمكن الزر من تركيزه، ويحتفظ useMemo بالقائمة المرشحة حتى يتغير الاستعلام، ويسجّل useEffect بعد كل عرض تغيّر فيه الاستعلام. اكتب an وراقب Console: سطر لكل ضغطة مفتاح، بعد أن تتحدث القائمة.
لماذا وُجدت الخطافات
قبل React 16.8 كان المكوّن الذي يحتاج إلى حالة أو كود دورة حياة يجب أن يكون صنفًا. وكان منطق الميزة الواحدة مقسمًا بين componentDidMount وcomponentDidUpdate وcomponentWillUnmount، وكانت مشاركته بين المكوّنات تعني mixins (التي لم تعمل قط مع صيغة الأصناف)، أو مكوّنات عليا، أو render props، وكلها تغلّف شجرتك بطبقات إضافية.
// The class way: one feature, three methods
class Clock extends React.Component {
state = { now: new Date() };
componentDidMount() {
this.id = setInterval(() => this.setState({ now: new Date() }), 1000);
}
componentWillUnmount() {
clearInterval(this.id);
}
render() {
return <p>{this.state.now.toLocaleTimeString()}</p>;
}
}
مع الخطافات تعيش الميزة نفسها في مكان واحد: يبدأ التأثير المؤقت وتوقفه دالة التنظيف الخاصة به.
أخفِ الساعة فتطبع Console السطر timer stopped: شغّلت React دالة التنظيف عندما غادر Clock الشاشة. أظهرها من جديد فيبدأ مؤقت جديد. ما زالت مكوّنات الأصناف تعمل في React 19، لكن الكود الجديد يستخدم الخطافات.
كل الخطافات المدمجة
تجمع React 19.2 خطافاتها حسب ما تعطيه للمكوّن. ستستخدم المجموعتين الأوليين كل يوم، والباقي عندما تستدعيه مشكلة محددة.
| الخطاف | ما يعطيك إياه | الصفحة |
|---|---|---|
useState | قيمة تبقى بين مرات العرض ودالة ضبط تعيد العرض | useState |
useReducer | حالة تُحدَّث بدالة مختزل وإجراءات مرسلة | useReducer |
useContext | قيمة يوفرها أب، دون تمرير props | useContext |
useRef | صندوق قابل للتغيير يبقى بين مرات العرض، وغالبًا عقدة DOM | useRef |
useImperativeHandle | يختار ما يراه الأب عبر مرجعك | forwardRef |
useEffect | كود يعمل عادةً بعد الرسم: المؤقتات والاشتراكات والجلب | useEffect |
useLayoutEffect | كود يعمل بعد تحديث DOM وقبل الرسم | useLayoutEffect |
useInsertionEffect | يعمل قبل تأثيرات التخطيط، لمكتبات CSS-in-JS | |
useEffectEvent | دالة يستطيع التأثير استدعاءها وترى دائمًا أحدث props وحالة | useEffect |
useMemo | يخزّن قيمة محسوبة بين مرات العرض | useMemo |
useCallback | يخزّن دالة بين مرات العرض | useCallback |
useTransition | يعلّم تحديثًا كغير عاجل ويخبرك ما دام معلقًا | useTransition |
useDeferredValue | نسخة من قيمة تتأخر عنها أثناء مرات العرض الثقيلة | useDeferredValue |
useId | معرّف فريد يتطابق على الخادم والعميل | useId |
useSyncExternalStore | يشترك في مخزن يعيش خارج React | useSyncExternalStore |
useDebugValue | تسمية لخطاف مخصص في React DevTools | |
use | يقرأ وعدًا أو سياقًا، ويمكن أن يكون داخل شرط | use |
useActionState | حالة يحدّثها إجراء نموذج، مع علامة انتظار | useActionState |
useOptimistic | يعرض النتيجة المتوقعة قبل أن يجيب الخادم | useOptimistic |
useFormStatus | حالة الانتظار للنموذج الأب (من react-dom) |
وصلت use وuseActionState وuseOptimistic وuseFormStatus مع React 19، وأصبح useEffectEvent مستقرًا في 19.2. وكل خطاف آخر في القائمة يعمل في React 18 أيضًا.
الحالة تعيد العرض، والمراجع لا
ليس كل خطاف يطلق عرضًا. useState وuseReducer يفعلان: غيّر قيمتهما فترسم React المكوّن من جديد. أما useRef فيسلّمك كائنًا يمكنك تغيير حقله current بحرية، ولا تعيد React العرض بسببه أبدًا. وهذا يجعله المكان المناسب لمعرّف مؤقت، أو قيمة سابقة، أو عدد لا تعرضه الشاشة.
يحمل useReducer السلة ويحمل useState الملاحظة؛ وكلاهما يسبب عرضًا عندما يتغير، ويسجّل التأثير سطرًا واحدًا لكل عرض. ويغيّر التأثير أيضًا commits.current، لكن ذلك التغيير لا يسبب عرضًا خاصًا به أبدًا، فلا يدخل السجل في حلقة. يُحدَّث العدد في تأثير لا في جسم المكوّن لأن الجسم ينبغي ألا يغيّر شيئًا أثناء العرض.
قواعد الخطافات
يتبع كل خطاف قاعدتين:
- استدعِ الخطافات في المستوى الأعلى من مكوّنك، ولا تستدعها أبدًا داخل شرط أو حلقة أو دالة متداخلة.
- لا تستدعِ الخطافات إلا من مكوّنات الدوال أو من خطافاتك المخصصة.
لا تعرف React الخطافات بأسمائها. بل تعرفها بالترتيب الذي تستدعيها به، وتتوقع أن يكون هذا الترتيب نفسه في كل عرض. خطاف داخل if سيزيح كل خطاف بعده. تُظهر صفحة قواعد الخطافات ما الذي ينكسر وكيف تصلحه. وuse هو الاستثناء الوحيد: يمكن استدعاؤه داخل شرط.
أول خطاف مخصص لك
عندما يحتاج مكوّنان إلى المنطق ذي الحالة نفسه، انقله إلى دالة يبدأ اسمها بـ use. يمكن لتلك الدالة استدعاء أي خطاف آخر. ويحصل كل مكوّن يستدعيها على حالته الخاصة.
يشغّل العدّادان الخطاف نفسه، لكن النقر على أحدهما يترك الآخر وشأنه: الخطاف المخصص يشارك المنطق لا الحالة. أضف دالة decrement إلى useCounter وزرًا يستدعيها، فيحصل عليها العدّادان معًا. وتوجد أنماط أخرى (useToggle وuseDebounce وuseLocalStorage) في صفحة الخطافات المخصصة.
أي خطاف تختار
- ينبغي أن تتغير الشاشة عندما تتغير قيمة:
useState، أوuseReducerعندما تحدّث أحداث كثيرة الحالة نفسها. - تحتاج إلى التواصل مع شيء خارج React (مؤقت، أو اشتراك، أو طلب):
useEffect. - تحتاج إلى عقدة DOM أو قيمة لا تعرضها الشاشة:
useRef. - تحتاج مكوّنات كثيرة في عمق الشجرة إلى القيمة نفسها:
useContext. - العرض بطيء بسبب عملية حسابية واحدة أو لأن ابنًا محفوظًا يُعاد عرضه:
useMemoوuseCallback. يستطيع React Compiler إضافة هذا الحفظ لك، لكن كتابته يدويًا ما زالت تعمل وما زالت شائعة. - الكتابة تبدو متأخرة لأن التحديث الذي خلفها ثقيل:
useTransitionأوuseDeferredValue.
الأسئلة الشائعة
ما هي الخطافات في React؟
الخطافات دوال تبدأ أسماؤها بـ use تتيح لمكوّن الدالة استخدام ميزات React: useState للحالة، وuseEffect للآثار الجانبية، وuseContext للسياق، وuseRef للقيم التي تبقى بين مرات العرض دون أن تسبب عرضًا، وغيرها.
لماذا أُضيفت الخطافات إلى React؟
قبل الخطافات (React 16.8) كانت الحالة وتوابع دورة الحياة موجودة في مكوّنات الأصناف فقط، وكانت مشاركة المنطق ذي الحالة تحتاج إلى mixins أو مكوّنات عليا أو render props. وضعت الخطافات ذلك المنطق في دوال عادية يمكنك استدعاؤها من أي مكوّن دالة ومشاركتها كخطافات مخصصة.
كم عدد الخطافات في React؟
تأتي React 19.2 بنحو عشرين خطافًا مدمجًا في الحزمة react، إضافة إلى useFormStatus في react-dom. ومعظم التطبيقات تستخدم يوميًا عددًا قليلًا منها: useState وuseEffect وuseRef وuseContext وuseMemo وuseCallback.
هل يمكنني استخدام الخطافات في مكوّنات الأصناف؟
لا. لا تعمل الخطافات إلا داخل مكوّنات الدوال والخطافات الأخرى. لكن يمكنك عرض مكوّن صنف بجانب مكوّنات دوال، ويمكن للصنف أن يعرض مكوّن دالة يستخدم الخطافات.
ما هو الخطاف المخصص؟
دالتك الخاصة التي يبدأ اسمها بـ use وتستدعي خطافات أخرى. تتيح لعدة مكوّنات إعادة استخدام المنطق ذي الحالة نفسه، بينما يحصل كل مكوّن يستدعيها على حالته المنفصلة.