useFetch Pattern Hook الاستخدام useFetch
آخر تحديث: 2026-11-03
useFetch Pattern Hook الاستخدام useFetch
اسحب منطق الطلب الثلاثي الحالات إلى Hook مخصّص useFetch(url): يستدعي المكوّن سطرًا واحدًا ويحصل على { data, loading, error }، فلا يتبعثر حالة الطلب في الكود. هذه الحالة الكلاسيكية لإعادة استخدام المنطق، ودرجة السلّم إلى TanStack Query. وتشترك كل المكوّنات في سلوك موثوق واحد، ويبقى التنظيف في مكان واحد لا يُنسخ.
| المجموعة | البيانات والهندسة |
|---|---|
| النوع | نمط |
ℹ️ ملاحظة يحوّل المحرّر JSX إلى JavaScript ويعرض الواجهة الحقيقية داخل بيئة معزولة؛ تُركَّب المكوّنات تلقائياً دون استدعاء render يدوي.
📝 الصيغة
function useFetch(url) {
const [state, setState] = useState({ data: null, loading: true, error: null })
useEffect(() => {
const ctrl = new AbortController() // cancel the old request when url changes or on unmount
setState({ data: null, loading: true, error: null })
fetch(url, { signal: ctrl.signal })
.then(r => r.ok ? r.json() : Promise.reject(new Error('HTTP ' + r.status)))
.then(data => setState({ data, loading: false, error: null }))
.catch(err => err.name !== 'AbortError' &&
setState({ data: null, loading: false, error: err }))
return () => ctrl.abort() // cleanup: stops a stale response from overwriting fresh data
}, [url])
return state
}
⚙️ المعاملات
| url | عنوان الطلب؛ ي acting كاعتماد، فعند تغيّره يعيد Hook الطلب تلقائيًا ويلغي السابق. |
|---|
القيمة المرجعة:لا قيمة مرجعة؛ إنها نمط برمجي وليست واجهة قابلة للاستدعاء.
▶ مثال
المثال يعمل مباشرة: يُعرض تلقائياً عند التوسيع وتظهر التعديلات فوراً.
الناتج:
النقر على «التبديل إلى #2» يُطلق طلبًا جديدًا ويعرض حالة التحميل لحظة ثم يرسم todo المطابق — يكتب المكوّن سطر useFetch(url) واحد بينما يُعاد استخدام منطق الحالات الثلاث كاملًا.
💡 النقاط الأساسية
💡 نصيحة أضف لنسخة متقدمة دالة refetch للتحديث اليدوي وMap ذاكرة على مستوى الوحدة، فتقترب من جنين TanStack Query (انظر القسم التالي).
⚠️ تحذير عند التبديل السريع قد يعود الطلب القديم أخيرًا فيطمس البيانات الجديدة: يجب إلغاؤه أو — كما في المثال — إسقاط الاستجابة البالية بعلامة alive.
ℹ️ ملاحظة يجب أن يبدأ اسم Hook المخصّص بـ use، وإلا قد لا يستدعي Hooks أخرى قانونيًا ويشتكي فحص lint.
🏷️ المزيد من البيانات والهندسة
💡 حالات ذات صلة
المزيد من الحالات قريباً.
📚 دروس ذات صلة
طلبات HTTP
الدرس 19: التطوّر الكامل لـ useFetch المكتوب يدويًا.
الـ Hooks المخصّصة
الدرس 14: وصفة فصل المنطق القابل لإعادة الاستخدام.
❓ الأسئلة الشائعة
س هل يُحذّر setState بعد فك التركيب؟
ج لم يعد React 18 يحذّر، لكن الكتابة مهدرٌ وقد تأتي خارج الترتيب؛ ويبقى الإبقاء على تنظيف abort أو alive ممارسة جيدة.
س كيف أدعم POST؟
ج مرّر التابع والجسم كوسائط إلى useFetch(url, options)، أو افصل Hook بأسلوب mutation للكتابة.
س هل يطلق مكوّنان بنفس url طلبين؟
ج نعم. حالة Hook تتبع موقع الاستدعاء ولا تُشارَك؛ لذاكرة مشتركة استخدم TanStack Query أو ابنِ ذاكرة على مستوى الوحدة بنفسك.