جستجو برای:
سبد خرید 0
  • صفحه اصلی
  • دوره های آموزشی
    • آموزش کتابخانه Ant Design به سادگی آب خوردن !
    • آموزش ساخت داشبورد حرفه ای با ری اکت !
    • آموزش فریمورک Tailwind CSS به زبان ساده!
    • آموزش HTML و CSS پروژه محور و اصولی !
  • وبلاگ
  • تماس با ما
  • درباره ما
logo-frontendi-150
0
  • خانه
  • دوره ها
  • وبلاگ فِرانت اِندی
  • تماس با ما
ورود / عضویت
  • صفحه اصلی
  • دوره های آموزشی
    • آموزش کتابخانه Ant Design به سادگی آب خوردن !
    • آموزش ساخت داشبورد حرفه ای با ری اکت !
    • آموزش فریمورک Tailwind CSS به زبان ساده!
    • آموزش HTML و CSS پروژه محور و اصولی !
  • وبلاگ
  • تماس با ما
  • درباره ما
ورود / عضویت

وبلاگ

فرانت اندی > وبلاگ فِرانت اِندی > ری اکت > هوک useFormStatus در ری اکت ! ( بررسی مبتدی تا پیشرفته )

هوک useFormStatus در ری اکت ! ( بررسی مبتدی تا پیشرفته )

19 مرداد 1404
ارسال شده توسط احمد احمدنژاد
ری اکت
هوک useFormStatus در ری اکت - هوک useFormStatus در ریکت - هوک useFormStatus در React

اگر با فرم ها در ری اکت کار کرده باشی، میدونی همیشه چند تا دغدغه داریم:

  • فرم در حال ارسال هست یا نه؟

  • دکمه ارسال باید غیرفعال بشه یا نه؟

  • وقتی ارسال تموم شد، چه پیامی نشون بدیم؟

  • اگه چند تا فرم تو یک صفحه داشتیم، چطور وضعیت هر کدوم رو جدا بفهمیم؟

قبل از ری اکت 19 که این هوک نبود، اینا رو معمولا با چند تا useState و کلی کد اضافی هندل میکردیم.
ولی الان با هوک useFormStatus در ری اکت همه اینا خیلی راحت تر و تمیزتر حل میشه.

هوک useFormStatus در ری اکت چیه ؟!

useFormStatus یه هوک مخصوص Server Actions هست که وضعیت یک فرم رو موقع ارسال و گرفتن دیتا میده.
مثلا:

  • pending: آیا فرم الان در حال ارسال هست؟

  • data: داده هایی که کاربر وارد کرده

  • method: متد ارسال (POST، GET، …)

  • action: آدرس یا تابعی که قراره فرم رو پردازش کنه

یه نکته این هوک فقط داخل محدوده یک "تگ فرم" کار میکنه. یعنی اگه بیاریش بیرون فرم، همیشه pending رو false میده.

پیش نیازها

برای استفاده باید:

  • React 18.3 یا بالاتر داشته باشی

  • پروژه ات Server Actions رو پشتیبانی کنه (مثل Next.js 13 به بعد)

  • فرم رو با اکشن سمت سرور ("use server") هندل کنی

یک مثال ساده

1. ساخت اکشن سمت سرور

				
					// app/actions.ts
"use server";

export async function createUser(formData: FormData) {
  const name = formData.get("name") as string;

  await new Promise((r) => setTimeout(r, 2000)); // شبیه سازی تاخیر

  console.log("User created:", name);
}

				
			

2. ساخت دکمه ارسال با useFormStatus

				
					"use client";

import { useFormStatus } from "react-dom";

export function SubmitButton() {
  const { pending } = useFormStatus();

  return (
    <button
      type="submit"
      disabled={pending}
      className="px-4 py-2 bg-blue-600 text-white rounded"
    >
      {pending ? "در حال ارسال..." : "ثبت نام"}
    </button>
  );
}

				
			

3. فرم اصلی

 
				
					import { createUser } from "./actions";
import { SubmitButton } from "./SubmitButton";

export default function Page() {
  return (
    <form action={createUser} className="space-y-4">
      <input
        type="text"
        name="name"
        placeholder="نام"
        className="border p-2 rounded w-full"
      />
      <SubmitButton />
    </form>
  );
}

				
			

نکات پیشرفته تر

1. چند فرم در یک صفحه

چون useFormStatus به محدوده خودش وابسته هست، اگه دو تا فرم داشته باشی، هر دکمه فقط وضعیت فرم خودش رو میگیره.
این یعنی دیگه مشکل اشتباه غیرفعال شدن دکمه های فرم های دیگه رو نداری.

 

2. گرفتن اطلاعات بیشتر

				
					const { pending, data, method, action } = useFormStatus();

				
			
  • data → داده های ارسال شده (FormData)

  • method → متد HTTP (POST یا GET)

  • action → آدرس یا تابع پردازش فرم

3. نمایش پیام موفقیت یا خطا

				
					"use client";
import { useState } from "react";
import { useFormStatus } from "react-dom";

export function SubmitButtonWithMessage() {
  const { pending } = useFormStatus();
  const [done, setDone] = useState(false);

  return (
    <>
      <button
        type="submit"
        disabled={pending}
        onClick={() => setDone(false)}
        className="px-4 py-2 bg-green-600 text-white rounded"
      >
        {pending ? "در حال ارسال..." : "ارسال"}
      </button>
      {done && <p className="text-green-600 mt-2">ارسال موفق بود 🎉</p>}
    </>
  );
}

				
			

البته باید بعد از اتمام اکشن سمت سرور، setDone(true) رو صدا بزنی (مثلا با ریدایرکت یا mutation).

 

4. ولیدیشن سمت سرور

با ترکیب useFormStatus و اکشن های سمت سرور میتونی:

  • اعتبارسنجی رو روی سرور انجام بدی

  • پیام خطا رو برگردونی

  • در UI نمایش بدی

مثال:

				
					"use server";
export async function registerUser(formData: FormData) {
  const email = formData.get("email") as string;
  if (!email.includes("@")) {
    throw new Error("ایمیل معتبر نیست");
  }
}

				
			

5. تجربه کاربری بهتر

وقتی pending هست:

  • دکمه ارسال رو غیرفعال کن

  • اسپینر یا لودینگ نشون بده

  • ورودی ها رو readOnly کن که کاربر وسط ارسال، داده رو تغییر نده

جمع بندی

هوک useFormStatus در React باعث میشه بدون مدیریت دستی state، وضعیت دقیق فرم رو تو همون محدوده بگیری.
این یعنی:

  • کد تمیزتر

  • کنترل بهتر فرم

  • UX بهتر مخصوصا وقتی چند فرم داری

درباره احمد احمدنژاد

من یه برنامه نویس و توسعه دهنده وب هستم که عاشق دنیای صفر و یکم❤️

نوشته‌های بیشتر از احمد احمدنژاد
قبلی هوک useActionState در ری اکت ! ( بررسی مبتدی تا پیشرفته )
بعدی معماری ماژولار در پروژه های ری اکت !

پست های مرتبط

ماژولار در ری اکت - ماژولار در React

11 مهر 1404

معماری ماژولار در پروژه های ری اکت !

احمد احمدنژاد
ادامه مطلب
هوک useActionState در ری اکت - هوک useActionState در ریکت - هوک useActionState در React

18 مرداد 1404

هوک useActionState در ری اکت ! ( بررسی مبتدی تا پیشرفته )

احمد احمدنژاد
ادامه مطلب
هوک useOptimistic در ری اکت - هوک useOptimistic در ریکت - هوک useOptimistic در React

18 مرداد 1404

هوک useOptimistic در ری اکت ! ( بررسی مبتدی تا پیشرفته )

احمد احمدنژاد
ادامه مطلب
معماری MRAH در ری اکت - معماری MRAH در React - معماری MRAH در ریکت

15 مرداد 1404

معماری MRAH در ری اکت و هرچیزی که باید ازش بدونیم!

احمد احمدنژاد
ادامه مطلب
سرور کامپوننت در ری اکت - React Server Component چیست - بررسی RSC - آموزش RSC

13 مرداد 1404

ری اکت سرور کامپوننت چیه ؟! ( بررسی کامل React Server Component )

احمد احمدنژاد
ادامه مطلب

دیدگاهتان را بنویسید لغو پاسخ

جستجو برای:
پیاده سازی و مشاوره فِرانت اِند!

پیاده سازی اصولی و بهینه پروژه های فِرانت اِند در کمترین زمان ممکن 🙂

پیاده سازی و مشاوره

صفحات فِرانت اِندی
  • وبلاگ
  • تماس با ما
  • درباره ما
تماس با ما
  • [email protected]
  • 09102944692
شبکه های اجتماعی
Youtube Instagram Telegram