0Pricing
React Academy · درس

الطفرات باستخدام useMutation

أرسل البيانات إلى واجهات API باستخدام useMutation، وعالج حالات التحميل والخطأ، وأبطِل الاستعلامات عند النجاح.

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

مرحبًا

في هذا الدرس، ستستخدمون useMutation لنشر البيانات إلى واجهات API، وستتعاملون مع حالتي التحميل والخطأ، وستُبطلون الاستعلامات القديمة بعد نجاح التغييرات.

أساسيات useMutation

استدعوا useMutation مع mutationFn. فهي تُعيد دالة mutate وخصائص الحالة. استدعوا mutate() لبدء العملية.
import { useMutation } from '@tanstack/react-query';

const { mutate, isLoading, isError } = useMutation({
  mutationFn: (newPost) => fetch('/api/posts', {
    method: 'POST',
    body: JSON.stringify(newPost),
  }).then(r => r.json()),
});

استدعاء mutate

استدعوا `mutate(variables)` من معالج أحداث. وتُمرَّر variables إلى mutationFn باعتبارها الوسيط الأول.
<button onClick={() => mutate({ title: 'New Post' })}>
  Create Post
</button>

عمليات الاستدعاء: onSuccess وonError وonSettled

أضيفوا خيارات عمليات الاستدعاء إلى useMutation: تُنفَّذ onSuccess بعد نجاح التغيير، وتُنفَّذ onError عند الفشل، وتُنفَّذ onSettled في كلتا الحالتين (مثل finally).
useMutation({
  mutationFn: createPost,
  onSuccess: (data) => {
    console.log('Created:', data);
    navigate('/posts/' + data.id);
  },
  onError: (error) => {
    toast.error(error.message);
  },
})

إبطال الاستعلامات بعد التغيير

بعد نجاح التغيير، أبطلوا الاستعلامات ذات الصلة حتى تعيد React Query جلب البيانات الحديثة. استخدموا queryClient.invalidateQueries داخل onSuccess.
import { useQueryClient } from '@tanstack/react-query';

const queryClient = useQueryClient();

const { mutate } = useMutation({
  mutationFn: createPost,
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['posts'] });
  },
});

mutateAsync لصيغة await

استخدموا `mutateAsync` بدلًا من `mutate` لانتظار التغيير ومعالجته باستخدام try/catch.
const { mutateAsync } = useMutation({ mutationFn: createPost });

async function handleSubmit() {
  try {
    const post = await mutateAsync({ title: 'Draft' });
    navigate('/posts/' + post.id);
  } catch (err) {
    setError(err.message);
  }
}

تعطيل الإرسال أثناء التغيير

استخدموا `isPending` (أو `isLoading`) لتعطيل زر الإرسال أثناء تنفيذ التغيير.
const { mutate, isPending } = useMutation({ mutationFn: saveItem });

<button onClick={() => mutate(item)} disabled={isPending}>
  {isPending ? 'Saving...' : 'Save'}
</button>

التحديثات المتفائلة باستخدام onMutate

استخدموا onMutate لتحديث التخزين المؤقت بشكل متفائل قبل استجابة الخادم. نفّذوا التراجع في onError باستخدام السياق الذي أعادته onMutate.
useMutation({
  mutationFn: likePost,
  onMutate: async (id) => {
    await queryClient.cancelQueries({ queryKey: ['posts'] });
    const prev = queryClient.getQueryData(['posts']);
    queryClient.setQueryData(['posts'], old => old.map(p =>
      p.id === id ? { ...p, likes: p.likes + 1 } : p));
    return { prev };
  },
  onError: (err, id, ctx) => queryClient.setQueryData(['posts'], ctx.prev),
  onSettled: () => queryClient.invalidateQueries({ queryKey: ['posts'] }),
})

إعادة ضبط حالة التغيير

استدعوا `reset()` من useMutation لمسح حالة التغيير (البيانات والخطأ والحالة). وهذا مفيد بعد الانتقال إلى صفحة أخرى أو مسح نموذج.
const { mutate, isError, reset } = useMutation({ /* ... */ });

{isError && (
  <>
    <p>Error!</p>
    <button onClick={reset}>Try Again</button>
  </>
)}

تغييرات متعددة بالتوازي

استدعوا mutate عدة مرات بالتوازي، إذ تُتتبَّع كل عملية استدعاء بشكل مستقل. استخدموا mutateAsync مع Promise.all للتغييرات المتوازية.
await Promise.all([
  mutateAsync({ id: 1, title: 'First' }),
  mutateAsync({ id: 2, title: 'Second' }),
]);

تحقّق سريع

بعد نجاح التغيير، ما الطريقة الموصى بها لضمان عرض الواجهة لبيانات محدثة؟

مراجعة

توفّر useMutation الدوال mutate وisPending وعمليات الاستدعاء الخاصة بدورة الحياة. استخدموا onSuccess لإبطال الاستعلامات ذات الصلة. استخدموا mutateAsync للتدفقات المعتمدة على await. واستخدموا onMutate/onError للتحديثات المتفائلة مع التراجع.

التالي

الدرس التالي: **التمرير اللانهائي وتقسيم الصفحات باستخدام useInfiniteQuery** — ستجلبون البيانات المقسمة إلى صفحات وتحملون صفحات إضافية بسلاسة.

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

هل درس «الطفرات باستخدام useMutation» مجاني؟

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

ماذا ستتعلم في «الطفرات باستخدام useMutation»؟

أرسل البيانات إلى واجهات API باستخدام useMutation، وعالج حالات التحميل والخطأ، وأبطِل الاستعلامات عند النجاح. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «الطفرات باستخدام useMutation»؟

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

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

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

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

  1. إعداد React Query وQueryClient
  2. التخزين المؤقت ومدة القِدم وإعادة الجلب في الخلفية
  3. الطفرات باستخدام useMutation
  4. التمرير اللانهائي وتقسيم الصفحات باستخدام useInfiniteQuery
← العودة إلى React Academy