Menu
flag Ar iconالعربيةdown icon

الخطافات في React: شرح كل خطاف بأمثلة حية

الخطاف دالة يبدأ اسمها بـ use تتيح للمكوّن استخدام ميزة من React مثل الحالة أو السياق أو المراجع أو التأثيرات. تعرّف على كل الخطافات المدمجة مجمّعة حسب الغرض، والقاعدتين اللتين يتبعهما كل خطاف، وكيف تكتب خطافك الخاص.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

الخطافات في 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قيمة يوفرها أب، دون تمرير propsuseContext
useRefصندوق قابل للتغيير يبقى بين مرات العرض، وغالبًا عقدة DOMuseRef
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يشترك في مخزن يعيش خارج ReactuseSyncExternalStore
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، لكن ذلك التغيير لا يسبب عرضًا خاصًا به أبدًا، فلا يدخل السجل في حلقة. يُحدَّث العدد في تأثير لا في جسم المكوّن لأن الجسم ينبغي ألا يغيّر شيئًا أثناء العرض.

قواعد الخطافات

يتبع كل خطاف قاعدتين:

  1. استدعِ الخطافات في المستوى الأعلى من مكوّنك، ولا تستدعها أبدًا داخل شرط أو حلقة أو دالة متداخلة.
  2. لا تستدعِ الخطافات إلا من مكوّنات الدوال أو من خطافاتك المخصصة.

لا تعرف 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 وتستدعي خطافات أخرى. تتيح لعدة مكوّنات إعادة استخدام المنطق ذي الحالة نفسه، بينما يحصل كل مكوّن يستدعيها على حالته المنفصلة.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن