SWR وReact Query لتخزين البيانات مؤقتًا
استخدم SWR أو TanStack Query لجلب بيانات الخادم وتخزينها مؤقتًا وإزالة التكرار وإعادة التحقق منها، بدلًا من أنماط الجلب اليدوية باستخدام useEffect
SWR وReact Query لتخزين البيانات مؤقتًا درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
حالة الخادم مختلفة
بيانات الشبكة ليست مجرد حالة عادية؛ فهي تحتاج إلى التخزين المؤقت، وإزالة التكرار، والتحديث في الخلفية، وتتبع التحميل والأخطاء، وإعادة المحاولة. تعيد أنماط الجلب اليدوية باستخدام useEffect + useState تنفيذ هذه الوظائف بطريقة سيئة.
SWR أم TanStack Query
SWR (من Vercel): صغير وبسيط ويعتمد على الخطافات فقط. TanStack Query (المعروف سابقًا باسم React Query): أكبر ويقدم ميزات أكثر (الطفرات، والتمرير اللانهائي، والجلب المسبق، وأدوات المطور). كلاهما ممتاز.
SWR — الاستخدام الأساسي
يعيد useSWR(key, fetcher) البيانات والخطأ وحالة التحميل. تُخزَّن البيانات مؤقتًا حسب المفتاح، وتُزال الطلبات المكررة بين المكونات.
import useSWR from 'swr';
const fetcher = (url) => fetch(url).then(r => r.json());
function Profile() {
const { data, error, isLoading } = useSWR('/api/me', fetcher);
if (error) return <ErrorMessage error={error} />;
if (isLoading) return <Spinner />;
return <h1>{data.name}</h1>;
}SWR — سلوك إعادة التحقق
يعيد SWR التحقق افتراضيًا عند استعادة التركيز (استعادة علامة التبويب لتركيزها) وعند إعادة الاتصال. ويعيد القيمة المخزنة مؤقتًا فورًا («قديمة»)، ثم يحدّثها في الخلفية («أثناء إعادة التحقق»).
SWR — الطفرة
يعيد mutate(key) التحقق من استعلام مخزن مؤقتًا. مرّروا بيانات جديدة كوسيط ثانٍ لتحديثها بشكل تفاؤلي.
import useSWR, { mutate } from 'swr';
async function updateProfile(updates) {
// Optimistic update — UI reflects change immediately
mutate('/api/me', { ...currentData, ...updates }, false);
await fetch('/api/me', { method: 'PUT', body: JSON.stringify(updates) });
// Revalidate to get the server's canonical state
mutate('/api/me');
}TanStack Query — الإعداد
غلّفوا تطبيقكم باستخدام QueryClientProvider مع QueryClient مُهيّأ.
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const client = new QueryClient({
defaultOptions: {
queries: { staleTime: 30000, retry: 2 }
}
});
function App() {
return (
<QueryClientProvider client={client}>
<Routes />
</QueryClientProvider>
);
}useQuery
يجلب useQuery({ queryKey, queryFn }) البيانات ويخزنها مؤقتًا.
import { useQuery } from '@tanstack/react-query';
function UserList() {
const { data, isLoading, error } = useQuery({
queryKey: ['users'],
queryFn: () => fetch('/api/users').then(r => r.json()),
staleTime: 60_000 // fresh for 1 minute
});
if (isLoading) return <Spinner />;
if (error) return <ErrorMessage error={error} />;
return <ul>{data.map(u => <li key={u.id}>{u.name}</li>)}</ul>;
}useMutation للكتابة
يتولى useMutation عمليات POST/PUT/DELETE مع حالتي انتظار وخطأ مضمّنتين، وخطاف onSuccess لإبطال التخزين المؤقت.
import { useMutation, useQueryClient } from '@tanstack/react-query';
function CreateUserForm() {
const qc = useQueryClient();
const m = useMutation({
mutationFn: (user) => fetch('/api/users', { method: 'POST', body: JSON.stringify(user) }),
onSuccess: () => qc.invalidateQueries({ queryKey: ['users'] })
});
return <button onClick={() => m.mutate({ name: 'Alice' })} disabled={m.isPending}>Create</button>;
}إبطال الاستعلامات
بعد إجراء طفرة، أبطلوا الاستعلامات المرتبطة لتحفيز إعادة الجلب. يضع queryClient.invalidateQueries({ queryKey: ['users'] }) علامة «قديمة» عليها ويعيد جلبها إذا كانت مركّبة.
التحديثات التفاؤلية
يوفر TanStack Query دعمًا متكاملًا للتحديثات التفاؤلية عبر onMutate وonError وonSettled.
useMutation({
mutationFn: updateUser,
onMutate: async (newUser) => {
await qc.cancelQueries({ queryKey: ['user', newUser.id] });
const previous = qc.getQueryData(['user', newUser.id]);
qc.setQueryData(['user', newUser.id], newUser);
return { previous };
},
onError: (_, newUser, ctx) => {
qc.setQueryData(['user', newUser.id], ctx.previous); // rollback
},
onSettled: (_, __, newUser) => {
qc.invalidateQueries({ queryKey: ['user', newUser.id] });
}
});الاستعلامات اللانهائية
يتولى useInfiniteQuery قوائم التمرير الصفحي أو اللانهائي — إذ يوفّر fetchNextPage ويتتبع جميع الصفحات التي جرى تحميلها.
أدوات مطور React Query
أضيفوا @tanstack/react-query-devtools للحصول على لوحة عائمة تعرض جميع الاستعلامات المخزنة مؤقتًا وحالاتها، وتتيح إبطالها يدويًا.
تحقق سريع
ما الفائدة الأساسية من استخدام SWR أو TanStack Query مقارنةً باستخدام useEffect + fetch يدويًا؟
مراجعة: SWR وReact Query
تحتاج حالة الخادم إلى التخزين المؤقت وإزالة التكرار وإعادة التحقق. يتميز SWR بصغر الحجم والبساطة، بينما يقدم TanStack Query ميزات أكثر (الطفرات، والاستعلامات اللانهائية، وأدوات المطور). استخدموا useQuery للقراءة وuseMutation للكتابة، واستدعوا invalidateQueries بعد الطفرات. نفّذوا التحديثات التفاؤلية باستخدام onMutate/onError. كلاهما يجعل useEffect+fetch اليدوي غير ضروري في تطبيقات الإنتاج.
الأسئلة الشائعة
هل درس «SWR وReact Query لتخزين البيانات مؤقتًا» مجاني؟
نعم — نص درس «SWR وReact Query لتخزين البيانات مؤقتًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «SWR وReact Query لتخزين البيانات مؤقتًا»؟
استخدم SWR أو TanStack Query لجلب بيانات الخادم وتخزينها مؤقتًا وإزالة التكرار وإعادة التحقق منها، بدلًا من أنماط الجلب اليدوية باستخدام useEffect تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «SWR وReact Query لتخزين البيانات مؤقتًا»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Fetch API: GET وPOST وPUT وDELETE
- Axios: المعترضات وعنوان URL الأساسي
- معالجة الأخطاء: رموز حالة HTTP
- SWR وReact Query لتخزين البيانات مؤقتًا