0Pricing
React Academy · درس

تنفيذ التحديثات المتفائلة يدويًا

طبّق الحالة المتفائلة محليًا، وضع عملية Mutation في قائمة الانتظار، وتعامل صراحةً مع حالتي النجاح والفشل

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

الحالة قبل عملية التعديل

تبدأ التحديثات المتفائلة اليدوية بحالة محلية للمكوّن تتم تهيئتها من بيانات الخادم: const [items, setItems] = useState(serverItems). وهذه الحالة المحلية هي ما تعرضه، وهي ما ستعدّله بشكل متفائل. لا تعدّل البيانات التي جلبها الخادم مباشرةً، بل احتفظ بنسخة محلية تتحكم فيها.

خطوة التحديث المتفائل

عندما يبدأ المستخدم عملية تعديل، مثل النقر على «إضافة» أو «إعجاب» أو «حذف»، نفّذ تحديث الحالة فورًا قبل استدعاء API: setItems(prev => [...prev, newItem]). تعكس الواجهة التغيير مباشرةً. وبعد هذا التحديث فقط، أرسل طلب الشبكة الفعلي.

حفظ الحالة السابقة

قبل تنفيذ التحديث المتفائل، احفظ الحالة الحالية: const previousItems = items. وتُعد هذه اللقطة الهدف الذي ستتراجع إليه. فإذا فشل استدعاء API، تستعيد هذه القيمة. خزّنها في متغير، لا في الحالة، لأنك تحتاج إليها فقط طوال مدة عملية التعديل المعلّقة.

إجراء استدعاء API

بعد التحديث المتفائل، أجرِ استدعاء API بشكل غير متزامن. لفّه داخل try/catch. عند النجاح، يمكنك اختياريًا إعادة جلب البيانات لمزامنة حالة الخادم، أو الوثوق بالحالة المتفائلة إذا كان الخادم سيعيد البيانات نفسها. وعند الفشل، استخدم الحالة السابقة التي حفظتها للتراجع.

التراجع عند الفشل

في كتلة catch الخاصة بعملية التعديل: setItems(previousItems). يعيد هذا الحالة إلى ما كانت عليه قبل التحديث المتفائل. وبعد التراجع، اعرض إشعارًا بالخطأ. يتفهم المستخدمون حدوث حالات فشل نادرة، لكن ما لا يمكنهم تقبّله هو عدم اتساق صامت.

عرض إشعار خطأ عند الفشل

بعد التراجع، اعرض رسالة خطأ: «تعذّر حفظ التغييرات. يُرجى المحاولة مرة أخرى.» مع زر «إعادة المحاولة» يعيد تشغيل عملية التعديل نفسها. يمنح هذا المستخدمين القدرة على التصرف. ويغطي الجمع بين التراجع وإشعار الخطأ وإعادة المحاولة حالة الفشل بسلاسة، دون حجب الواجهة بأكملها.

مشكلة المعرّف المؤقت

عند إضافة عنصر جديد بشكل متفائل، لا يكون الخادم قد عيّن له معرّفًا حقيقيًا بعد. أنشئ معرّفًا مؤقتًا للعنصر المتفائل: const tempId = crypto.randomUUID(). استخدمه مفتاحًا للعنصر في القائمة. وبعد استجابة API بنجاح، استبدل المعرّف المؤقت بالمعرّف الحقيقي الذي عيّنه الخادم.

تسوية المعرّفات المؤقتة

بعد نجاح عملية إنشاء، يستجيب الخادم بالمعرّف الحقيقي. حدّث حالتك لاستبدال العنصر المؤقت: setItems(prev => prev.map(item => item.id === tempId ? { ...item, id: serverResponse.id } : item)). وتضمن هذه التسوية استخدام معرّف الخادم الصحيح في العمليات اللاحقة.

مشكلة حالة السباق

إذا بدأ المستخدم عمليتي تعديل متتاليتين بسرعة، فقد تصل الاستجابات بترتيب مختلف. قد تصل استجابة العملية الثانية قبل الأولى، وقد يؤدي تراجع العملية الأولى إلى الكتابة فوق الحالة الصحيحة الناتجة عن العملية الثانية. وهذه حالة سباق تميّز الواجهة المتفائلة.

تسلسل عمليات التغيير لمنع حالات التنافس

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

نمط الحذف المتفائل

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

المعرّف المؤقت في التحديثات المتفائلة

لماذا تحتاج العناصر المضافة بتفاؤل إلى معرّف مؤقت؟

مراجعة الدرس: التحديثات المتفائلة اليدوية

النمط اليدوي هو: احتفظ بنسخة من previousItems، واضبط items باستخدام الحالة الجديدة، واستدعِ واجهة برمجة التطبيقات، ثم أعد الحالة السابقة عند الفشل باستخدام setItems(previousItems) واعرض رسالة خطأ. عند الإضافة، استخدم crypto.randomUUID() كمعرّف مؤقت، ثم طابقه مع معرّف الخادم عند النجاح. امنع حالات التنافس بتعطيل زر التشغيل أثناء تنفيذ عمليات التغيير. يُعد التراجع + إشعار toast + إعادة المحاولة تجربة المستخدم القياسية عند الفشل.

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

هل درس «تنفيذ التحديثات المتفائلة يدويًا» مجاني؟

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

ماذا ستتعلم في «تنفيذ التحديثات المتفائلة يدويًا»؟

طبّق الحالة المتفائلة محليًا، وضع عملية Mutation في قائمة الانتظار، وتعامل صراحةً مع حالتي النجاح والفشل تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «تنفيذ التحديثات المتفائلة يدويًا»؟

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

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

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

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

  1. ما هي الواجهة المتفائلة ومتى تُستخدم
  2. تنفيذ التحديثات المتفائلة يدويًا
  3. التراجع عند الخطأ وحل التعارضات
  4. أنماط التفاؤل مع React Query وZustand
← العودة إلى React Academy