0Pricing
Frontend Academy · درس

جلب البيانات عند التحميل

اجلب JSON من API داخل useEffect، وخزّن الاستجابة في الحالة، وشغّل الجلب مرة واحدة فقط باستخدام مصفوفة اعتماديات فارغة.

جلب البيانات عند التحميل درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.

نمط جلب البيانات

نمط جلب البيانات القياسي في React: 1) عرّف حالات التحميل والخطأ والبيانات؛ 2) اجلب البيانات داخل useEffect باستخدام التبعيات الفارغة []؛ 3) حدّث الحالة في دالة الاستدعاء؛ 4) اعرض الواجهة بناءً على الحالة.

مثال كامل

مثال كامل لجلب المستخدمين عند التركيب مع التعامل مع حالتي التحميل والخطأ.

interface User { id: number; name: string; email: string; }

function UserList() {
  const [users, setUsers] = useState<User[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    fetch('/api/users')
      .then(res => {
        if (!res.ok) throw new Error(`HTTP ${res.status}`);
        return res.json();
      })
      .then(data => setUsers(data))
      .catch(err => setError(err.message))
      .finally(() => setLoading(false));
  }, []);

  if (loading) return <Spinner />;
  if (error)   return <ErrorMessage message={error} />;
  return <ul>{users.map(u => <UserItem key={u.id} {...u} />)}</ul>;
}

استخدام async/await في useEffect

لا يمكن أن تكون دالة الاستدعاء في useEffect غير متزامنة مباشرةً، لأنها ستعيد Promise وستفسرها React على أنها دالة تنظيف. بدلًا من ذلك، عرّف دالة داخلية غير متزامنة واستدعها فورًا.

useEffect(() => {
  async function fetchUsers() {
    try {
      const res = await fetch('/api/users');
      if (!res.ok) throw new Error(`HTTP ${res.status}`);
      const data = await res.json();
      setUsers(data);
    } catch (err) {
      setError((err as Error).message);
    } finally {
      setLoading(false);
    }
  }

  fetchUsers();
}, []);

التحقق من حالة الاستجابة

لا تُلقي fetch خطأً عند حدوث أخطاء HTTP، مثل 4xx و5xx، بل عند فشل الشبكة فقط. تحقّق دائمًا من response.ok وألقِ الخطأ يدويًا لاستجابات الأخطاء.

const res = await fetch('/api/data');
if (!res.ok) {
  // Could also use res.status for specific handling
  throw new Error(`Server responded ${res.status}: ${res.statusText}`);
}
const data = await res.json();

الجلب عند تغيّر تبعية

أضف التبعية، مثل معرّف من معاملات المسار أو الخصائص، إلى مصفوفة تبعيات التأثير. سيُعاد تنفيذ التأثير ويجلب بيانات حديثة كلما تغيّرت التبعية.

const { userId } = useParams();

useEffect(() => {
  if (!userId) return;
  setLoading(true);
  fetch(`/api/users/${userId}`)
    .then(r => r.json())
    .then(setUser)
    .finally(() => setLoading(false));
}, [userId]);

طلبات POST في التأثيرات

يمكن للتأثيرات أيضًا إرسال طلبات POST/PUT/DELETE، لكن هذه الطلبات تُشغَّل عادةً بواسطة الأحداث، مثل إرسال نموذج أو النقر على زر، وليس بواسطة التأثيرات عند التركيب. خصّص التأثيرات لتحميل البيانات، واستخدم معالجات الأحداث لعمليات التغيير.

خطاف useFetch مخصص

استخرج نمط الجلب والتحميل والخطأ في خطاف مخصص لإعادة استخدامه عبر المكوّنات.

function useFetch<T>(url: string) {
  const [data, setData] = useState<T | null>(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    setLoading(true);
    fetch(url)
      .then(r => { if (!r.ok) throw new Error(`${r.status}`); return r.json(); })
      .then(setData)
      .catch(e => setError(e.message))
      .finally(() => setLoading(false));
  }, [url]);

  return { data, loading, error };
}

تحليل JSON بأمان

أحط res.json() دائمًا بكتلة try/catch، لأن JSON غير السليم يُلقي SyntaxError. ستتعامل كتلة catch الخارجية معه، لكن معرفة مصدره تساعد في تصحيح الأخطاء.

تهيئة عنوان URL الأساسي لواجهة API

لا تضع عناوين URL لواجهة API بشكل ثابت في الرمز. استخدم متغيرات البيئة، مثل import.meta.env.VITE_API_URL، للعنوان الأساسي. أنشئ ملف api.ts مركزيًا يتضمن غلاف fetch مُهيّأ.

const API_BASE = import.meta.env.VITE_API_URL;

async function apiFetch<T>(path: string): Promise<T> {
  const res = await fetch(`${API_BASE}${path}`, {
    headers: { 'Authorization': `Bearer ${getToken()}` }
  });
  if (!res.ok) throw new Error(`API error ${res.status}`);
  return res.json();
}

متى تنتقل إلى React Query

تنجح أنماط الجلب اليدوية في الحالات البسيطة. عند الحاجة إلى التخزين المؤقت، وإعادة الجلب في الخلفية، وتقسيم الصفحات، أو عمليات التغيير، انتقل إلى React Query ‏(TanStack Query)، إذ يتعامل مع هذه الأنماط جميعًا بشكل موثوق.

عرض هيكل تحميل

بدلًا من عرض مؤشر انتظار، اعرض واجهة هيكلية تطابق شكل المحتوى بعد تحميله. يقلل ذلك من مدة التحميل المُدركة ويمنع تغيّر تخطيط الصفحة.

تحقق سريع

لماذا لا يمكنك جعل دالة الاستدعاء في useEffect غير متزامنة مباشرةً؟

مراجعة: جلب البيانات في useEffect

عرّف حالات التحميل والخطأ والبيانات. اجلب البيانات في useEffect باستخدام التبعيات الفارغة []. عرّف دالة داخلية غير متزامنة، ولا تجعل دالة الاستدعاء غير متزامنة. تحقّق دائمًا من res.ok. أضف عنوان URL أو المعرّف إلى التبعيات للجلب الديناميكي. استخرج النمط في خطاف useFetch مخصص لإعادة الاستخدام. فكّر في TanStack Query لجلب بيانات الإنتاج.

الأسئلة الشائعة

هل درس «جلب البيانات عند التحميل» مجاني؟

نعم — نص درس «جلب البيانات عند التحميل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.

ماذا ستتعلم في «جلب البيانات عند التحميل»؟

اجلب JSON من API داخل useEffect، وخزّن الاستجابة في الحالة، وشغّل الجلب مرة واحدة فقط باستخدام مصفوفة اعتماديات فارغة. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟

لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «جلب البيانات عند التحميل»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟

نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات useEffect: الاعتماديات والتنظيف
  2. جلب البيانات عند التحميل
  3. معالجة حالتي التحميل والخطأ
  4. AbortController للتنظيف
← العودة إلى Frontend Academy