useQuery useQuery لجلب البيانات
آخر تحديث: 2026-11-03
useQuery useQuery لجلب البيانات
يدير useQuery من TanStack Query كامل «دورة حياة الطلب + الذاكرة»: يُزيل التكرار تلقائيًا، ويجلب في الخلفية، وstaleTime يتحكّم في حداثة البيانات، وinvalidateQueries يُبطل ليعاد الجلب. يُعلن المكوّن فقط «ما البيانات التي أحتاجها» ويترك الباقي للمكتبة، فلا يُجلب ذات الاستعلام مرتين لمكوّنين.
| المجموعة | البيانات والهندسة |
|---|---|
| النوع | خطاف |
| منذ الإصدار | TanStack Query v5 |
ℹ️ ملاحظة يحوّل المحرّر JSX إلى JavaScript ويعرض الواجهة الحقيقية داخل بيئة معزولة؛ تُركَّب المكوّنات تلقائياً دون استدعاء render يدوي.
📝 الصيغة
import { useQuery } from '@tanstack/react-query'
const { data, isPending, isError, error, refetch } = useQuery({
queryKey: ['todo', id], // cache key: a change switches to or refetches the query
queryFn: () => fetch('/api/todos/' + id).then(r => r.json()),
staleTime: 30_000 // fresh for 30 seconds, no refetch needed
})
// isPending: first load without a cache; isFetching: any background refetch
⚙️ المعاملات
| queryKey | مفتاح الذاكرة (مصفوفة): في ['todos', id] يبدّل تغيير id إلى قيد الذاكرة المطابق ويعيد الجلب، ومفتاح متطابق يعيد استخدام الذاكرة. |
|---|---|
| staleTime | مدة حداثة البيانات (بالملي ثانية): ضمنها يعيد التركيب استخدام الذاكرة مباشرة؛ وبعدها يحدّث بهدوء في الخلفية (stale-while-revalidate). |
القيمة المرجعة:يُعيد حالة الاستعلام مثل { data, isPending, isError, error, refetch, isFetching }: يحمل data أحدث البيانات، وrefetch يُبطل القيد ويعيد الجلب يدويًا.
▶ مثال
المثال يعمل مباشرة: يُعرض تلقائياً عند التوسيع وتظهر التعديلات فوراً.
الناتج:
أول قراءة تنتظر 0.8 ثانية؛ وبعدها «اقرأ» يظهر لحظيًا لإصابة ذاكرة Map؛ و«refetch» يفرض طلبًا جديدًا ويحدّث الذاكرة — الأفكار الجوهرية خلف staleTime والإبطال (عرض توضيحي محاكى).
💡 النقاط الأساسية
💡 نصيحة ضع كل الاعتمادات في queryKey (['todos', filter, page]) فتُعيد المكتبة الجلب تلقائيًا عند تغيّرها — ذلك مصفوفة اعتمادات useEffect المسلَّمة لطبقة الذاكرة.
⚠️ تحذير يجب أن يحوي queryKey كل معاملات الطلب ويكون قابلًا للتسلسل؛ فحذف معامل يجعل بيانات مختلفة تشترك مفتاحًا واحدًا فيقع الخلط.
ℹ️ ملاحظة أعاد 5 تسمية loading إلى isPending: isPending يعني أول تحميل بلا ذاكرة، وisFetching يشمل التحديث الخلفي. والمعنيان مختلفان.
🏷️ المزيد من البيانات والهندسة
💡 حالات ذات صلة
المزيد من الحالات قريباً.
📚 دروس ذات صلة
❓ الأسئلة الشائعة
س ما الفرق بين staleTime وgcTime (سابقًا cacheTime)؟
ج staleTime تقرّر مدة حداثة البيانات بلا إعادة جلب، وgcTime تقرّر مدة بقاء قيد غير مستخدم قبل جمعه من الذاكرة. الأولى تقود تكرار الطلب والثانية استهلاك الذاكرة.
س كيف أُحدّث البيانات بعد تغيّرها؟
ج استدعِ refetch()، أو استخدم queryClient.invalidateQueries({ queryKey }) لتبطل الاستعلامات ذات الصلة، فتعيد المكوّنات المطابقة الجلب في الخلفية تلقائيًا.
س لماذا مفتاح queryKey مصفوفة لا سلسلة؟
ج المصفوفة مفتاح بنيوي: ['todos', 2] و['todos', 3] يُميَّزان بدقّة، ويمكن إبطال كل استعلام تحت بادئة ['todos'] دفعة فتبقى الذاكرة مُدارة بطبقات.