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'] دفعة فتبقى الذاكرة مُدارة بطبقات.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%