تخطَّ إلى المحتوى

useActionState()

إدارة حالة نموذج مبنية على Action useActionState()

useActionState يربط حالة بنتيجة تنفيذ دالة غير متزامنة (Action)، مع إدارة تلقائية لحالة "جارٍ التنفيذ" — مثالي لنماذج <form>.

useActionState(action, initialState, permalink?) يُرجع [state, formAction, isPending]. الدالة action تستقبل (previousState, formData) وتُرجع الحالة التالية؛ يبدأ state بقيمة initialState ثم يساوي آخر ما أرجعته action.

تمرير formAction مباشرة إلى <form action={formAction}> يجعل React يغلّف الإرسال تلقائيًا داخل Transition، فتتوفّر isPending جاهزة بلا كتابة startTransition يدويًا، وتُنفَّذ عدة استدعاءات متتالية بالترتيب.

الصياغة

const [state, formAction, isPending] = useActionState(action, initialState, permalink?);

async function action(previousState, formData) {
  // ...
  return newState;
}

📄 مثال

async function submitName(previousState, formData) {
  const name = formData.get("name");
  if (!name) return { error: "الاسم مطلوب" };
  await saveName(name);
  return { error: null };
}

function NameForm() {
  const [state, formAction, isPending] = useActionState(submitName, { error: null });
  return (
    <form action={formAction}>
      <input name="name" />
      {state.error && <p>{state.error}</p>}
      <button disabled={isPending}>{isPending ? "..." : "حفظ"}</button>
    </form>
  );
}

أهم المعاملات

المعاملالوظيفة
actionدالة (previousState, formData) => newState، يمكن أن تكون async
initialStateالقيمة الابتدائية — تُتجاهَل بعد أول تنفيذ لـ action
permalinkرابط اختياري يُستخدَم مع مكوّنات الخادم للتحسين التدريجي (progressive enhancement)

💡 نصائح عملية

  • لا حاجة لـ e.preventDefault() ولا useState منفصل لكل حقل — formData تصل جاهزة لدالة action
  • استخدم useFormStatus من react-dom في مكوّن فرعي داخل <form> لقراءة حالة الإرسال دون تمرير isPending يدويًا

⚠️ أخطاء شائعة

  • استدعاء formAction خارج سياق نموذج أو Transition بلا تغليفها بـ startTransition يدويًا
  • توقّع تحديث initialState لاحقًا — بعد أول استدعاء لـ action تُتجاهَل initialState كليًا ويُعتمَد فقط على القيمة المُرجَعة

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار REACT الكامل بالعربي.