useMutation useMutation لعمليات الكتابة

آخر تحديث: 2026-11-03

useMutation useMutation لعمليات الكتابة

يدير useMutation الحالة غير المتزامنة لعمليات الكتابة (POST وPUT وDELETE): تُطلق mutate الطلب، ويبلّغان isPending وisError عن التقدّم، وonSuccess يُبطل الاستعلامات ذات الصلة فتتحدّث القائمة تلقائيًا. لا يخزّن بيانات، بل يدير هذا الإرسال وحده. وهذا تقاسم العمل هو ما يجعل query وmutation زوجًا طبيعيًا. ويمكن تمرير ردود نداء لكل استدعاء، فيخدم Hook واحد عدة نماذج بلا مشاركة حالتها.

المجموعةالبيانات والهندسة
النوعخطاف
منذ الإصدارTanStack Query v5

ℹ️ ملاحظة يحوّل المحرّر JSX إلى JavaScript ويعرض الواجهة الحقيقية داخل بيئة معزولة؛ تُركَّب المكوّنات تلقائياً دون استدعاء render يدوي.

📝 الصيغة

import { useMutation, useQueryClient } from '@tanstack/react-query'

const qc = useQueryClient()
const mutation = useMutation({
  mutationFn: newTodo => fetch('/api/todos', {
    method: 'POST',
    body: JSON.stringify(newTodo)
  }).then(r => r.json()),
  onSuccess: () => {
    qc.invalidateQueries({ queryKey: ['todos'] })  // the list turns stale -> it refetches itself
  }
})

mutation.mutate({ title: 'New task' })   // fire the submission

⚙️ المعاملات

mutationFnمطلوب. الدالة غير المتزامنة التي تنفّذ الكتابة؛ وتصل المتغيّرات الممرّرة إلى mutate(variables) كوسيط لها.
onSuccess / onErrorخطافات رد نداء: أبطل الاستعلامات بعد النجاح، واعرض رسالة بعد الفشل؛ ويمكن تجاوزها لكل استدعاء بـ mutate(v, { onSuccess }).

القيمة المرجعة:يُعيد { mutate, isPending, isError, data, error }: mutate(variables) يُطلق الطلب (لا يُعيد Promise)، بينما mutateAsync يُعيد Promise.

▶ مثال

المثال يعمل مباشرة: يُعرض تلقائياً عند التوسيع وتظهر التعديلات فوراً.

الناتج:

يتحوّل زر الإرسال إلى «جارٍ الحفظ» ويُعطّل ثانية واحدة، ثم تكسب القائمة عنصرًا ويظهر تنبيه نجاح — السريان الكامل لـ mutate وisPending وonSuccess (عرض توضيحي محاكى).

💡 النقاط الأساسية

⚠️ تحذير mutate لا تُعيد Promise (يصل الناتج عبر ردود النداء)؛ وحين تحتاج await داخل دالة async استخدم mutateAsync وتعامل مع الأخطاء بنفسك.
💡 نصيحة بعد كتابة ناجحة استدعِ invalidateQueries بدل تعديل القائمة يدويًا — دع طبقة الذاكرة تعيد الجلب فيبقى الخادم والعميل متزامنين.
ℹ️ ملاحظة التحديث التفاؤلي (onMutate يعدّل الذاكرة أولًا ويرجع الفشل ما تراجع) يندرج أيضًا في سلسلة ردود useMutation، فيُحسّ الإرسال فوريًا.
المزيد من الحالات قريباً.

📚 دروس ذات صلة

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

س ما الفرق الجوهري بين useMutation وuseQuery؟
ج الاستعلام يقرأ بيانات بذاكرة ويجلب في الخلفية؛ والمMutation يكتب بلا ذاكرة ويُطلَق صراحةً بفعل المستخدم. اقرأ بـ query واكتب بـ mutation.
س كيف تتحدّث القائمة نفسها بعد الإرسال؟
ج استدعِ queryClient.invalidateQueries({ queryKey: ['todos'] }) في onSuccess: يُبطل استعلام القائمة ويعيد useQuery أحدث البيانات.
س كيف أمنع الإرسال المزدوج بالزر؟
ج عطّل الزر ما دام isPending صحيحًا (كالمثال) أو افحص الحالة قبل الإرسال؛ ويحتاج الخادم أيضًا لـ idempotency كشبكة أمان.
Web-Tutorial.com

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

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

100%