Three-State Fetching معالجة الطلب بثلاث حالات
آخر تحديث: 2026-11-03
Three-State Fetching معالجة الطلب بثلاث حالات
كل طلب بيانات له ثلاث حالات: loading أثناء التنفيذ، وsuccess عند وصول البيانات، وerror عند الفشل. يجب أن تُهيّئ الواجهة إطارًا لكل منها، وفقد أيٍّ منها يُنتج شاشة بيضاء أو انتظارًا أبديًا أو فشلًا صامتًا. هذا النموذج الذهني المشترك بين كود fetch المكتوب يدويًا وكل مكتبات الطلب، فتعلّمه مرة يفيد في كل مكان.
| المجموعة | البيانات والهندسة |
|---|---|
| النوع | نمط |
ℹ️ ملاحظة يحوّل المحرّر JSX إلى JavaScript ويعرض الواجهة الحقيقية داخل بيئة معزولة؛ تُركَّب المكوّنات تلقائياً دون استدعاء render يدوي.
📝 الصيغة
const [state, setState] = useState({ status: 'loading', data: null, error: null })
useEffect(() => {
fetch(url)
.then(r => r.ok ? r.json() : Promise.reject(new Error('HTTP ' + r.status)))
.then(data => setState({ status: 'success', data, error: null }))
.catch(err => setState({ status: 'error', data: null, error: err }))
}, [url])
if (state.status === 'loading') return <p>Loading…</p>
if (state.status === 'error') return <p>Error: {state.error.message}</p>
return <List data={state.data} />
⚙️ المعاملات
| status | حالة الآلة الحالية: 'loading' | 'success' | 'error'؛ ويمكن التعبير عنها بحقلين isLoading وisError. |
|---|
القيمة المرجعة:لا قيمة مرجعة؛ إنها نمط برمجي وليست واجهة قابلة للاستدعاء.
▶ مثال
المثال يعمل مباشرة: يُعرض تلقائياً عند التوسيع وتظهر التعديلات فوراً.
الناتج:
يُظهر الطلب التلقائي الأول «جارٍ التحميل»؛ وعند النجاح يظهر عنوان todo؛ وعند فشل الشبكة أو الواجهة تحصل على رسالة الخطأ مع زر إعادة المحاولة — إطار لكل حالة من الثلاث.
💡 النقاط الأساسية
⚠️ تحذير fetch لا يرفض عند 404 أو 500 (يُرفض فقط أخطاء طبقة الشبكة)، فافحص r.ok وألقِ الخطأ بنفسك، وإلا ينزلق الخطأ العمل إلى فرع success بصمت.
💡 نصيحة احصر الحالة في كائن state واحد لا ثلاث قيم منطقية، فيحول دون تركيبات غير قانونية مثل «loading صحيح وللخطأ قيمة».
ℹ️ ملاحظة تبني TanStack Query هذه الآلة داخل المكتبة (isPending وisError وdata)؛ وكتابة الثلاث يدويًا أفضل تمهيد لها.
🏷️ المزيد من البيانات والهندسة
💡 حالات ذات صلة
المزيد من الحالات قريباً.
📚 دروس ذات صلة
❓ الأسئلة الشائعة
س هل أستخدم ثلاث قيم منطقية isLoading/isError/hasData بدل status؟
ج يمكن، لكن تتسرّب التركيبات غير القانونية (اثنان صحيحان معًا). حقل status واحد هو سبيل الآلة، وكل تركيبة صحيحة ببنيتها.
س هل يُعاد الطلب تلقائيًا عند الفشل؟
ج حسب قواعد العمل: قراءةٌ قد تعيد المحاولة مرتين أو ثلاثًا بتراجع أسّي، وكتابةٌ يجب تأكيدها بشرية لتفادي تكرار الطلب.
س هل أعطّل الواجهة أثناء التحميل؟
ج عطّل زر طلب الإرسال لمنع الإرسال المزدوج؛ أما القراءة فلا تحتاج قفل الشاشة كلها، شاشة هيكلية تحفظ التفاعل.