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

وبلاگ

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

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

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

تو برنامه های وب، وقتی کاربر عملی انجام میده که نیاز به ارتباط با سرور داره، معمولا یه تاخیر بین کلیک کاربر و مشاهده ی نتیجه نهایی وجود داره. این تاخیر میتونه تجربه ی کاربری رو خراب کنه و حس کندی یا سنگینی به برنامه بده.

اینجاست که هوک useOptimistic وارد ماجرا میشه !

 تو این روش، ما نتیجه ی مورد انتظار رو فوری به کاربر نشون میدیم، حتی قبل از اینکه جواب واقعی از سمت سرور برسه. اگه جواب سرور موفقیت آمیز بود، همونو نگه میداریم و اگه خطا داشت، تغییر رو برمیگردونیم (rollback).

مثلا اگه کاربر لایک کرد، سریعا لایک رو بهش نمایش میدیم ( قبل اینکه جواب موفقیت آمیز سرور بدستمون برسه )
یا مثلا اگه کاربر کامنت ثبت کرد سریعا کامنت ثبت شده رو بهش نمایش میدیم ( قبل اینکه سرور پاسخ بده )

هوک useOptimistic در ری اکت چیست ؟

useOptimistic یه هوک داخلی تو ری اکت هست که کمک میکنه وضعیت رابط کاربری رو به صورت خوش بینانه آپدیت کنیم.

منظور از خوش بینانه این هست که فرض رو بر این میگیریم که دیتا بصورت موفق از بک اند به دستمون میرسه.

 

با این هوک میتونیم:

  • تغییرات رو فوری به کاربر نشون بدیم.

  • در صورت بروز خطا، وضعیت رو برگردونیم.

  • بدون نوشتن کلی کد اضافه برای حالت های موقت، تجربه ی کاربری رو سریع تر کنیم.

سینتکس پایه هوک useOptimistic

				
					const [optimisticState, addOptimistic] = useOptimistic(
  initialState,
  (currentState, newValue) => {
    return updatedState;
  }
);

				
			

پارامترها:

  1. initialState — حالت اولیه قبل از هر تغییر خوش بینانه.

  2. updateFn — تابعی که:

    • currentState: وضعیت فعلی رو میگیره

    • newValue: مقداری که میخوای اعمال بشه رو میگیره
      و در نهایت وضعیت خوش بینانه ی جدید رو برمیگردونه.

خروجی ها:

  • optimisticState: وضعیت خوش بینانه ای که تو UI نشون داده میشه.

  • addOptimistic: تابعی برای اعمال یک آپدیت خوش بینانه.

مثال دکمه لایک

فرض کن کاربر روی دکمه ی لایک میزنه:

				
					import { useOptimistic } from "react";
import { startTransition } from "react";

function LikeButton({ postId, initialLikes }) {
  const [optimisticLikes, addOptimistic] = useOptimistic(
    initialLikes,
    (currentLikes, increment) => currentLikes + increment
  );

  async function handleLike() {
    // تغییر خوش بینانه
    addOptimistic(1);

    // ارسال درخواست به سرور
    startTransition(async () => {
      try {
        await fetch(`/api/posts/${postId}/like`, { method: "POST" });
      } catch (err) {
        // در صورت خطا، برگشت به حالت قبل
        addOptimistic(-1);
      }
    });
  }

  return (
    <button onClick={handleLike}>
      👍 {optimisticLikes}
    </button>
  );
}

				
			

🔹 کاربر بلافاصله افزایش لایک رو میبینه و اگه درخواست به سرور شکست بخوره، عدد برمیگرده به حالت قبل.

 

مثال اضافه کردن کامنت

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

  1. کامنت رو فوری تو لیست میبینه.

  2. بعد از جواب سرور، یا همونو نگه میداریم یا حذف/تغییرش میدیم :

				
					import { useOptimistic } from "react";
import { startTransition } from "react";

function Comments({ postId, initialComments }) {
  const [optimisticComments, addOptimistic] = useOptimistic(
    initialComments,
    (currentComments, newComment) => [...currentComments, newComment]
  );

  async function handleAddComment(text) {
    const tempId = Date.now();
    const newComment = { id: tempId, text, pending: true };

    // اضافه کردن خوش بینانه
    addOptimistic(newComment);

    startTransition(async () => {
      try {
        const res = await fetch(`/api/posts/${postId}/comments`, {
          method: "POST",
          body: JSON.stringify({ text }),
          headers: { "Content-Type": "application/json" },
        });
        const savedComment = await res.json();

        // جایگزین کردن آی دی موقت با آی دی واقعی
        addOptimistic((comments) =>
          comments.map((c) =>
            c.id === tempId ? { ...savedComment, pending: false } : c
          )
        );
      } catch (err) {
        // حذف کامنت در صورت خطا
        addOptimistic((comments) => comments.filter((c) => c.id !== tempId));
      }
    });
  }

  return (
    <div>
      <ul>
        {optimisticComments.map((comment) => (
          <li key={comment.id}>
            {comment.text} {comment.pending && <em>(در حال ارسال...)</em>}
          </li>
        ))}
      </ul>
      <button onClick={() => handleAddComment("کامنت تستی")}>
        افزودن کامنت
      </button>
    </div>
  );
}

				
			

مدیریت خطا و Rollback

useOptimistic خودش به طور خودکار rollback انجام نمیده. باید خودت منطق برگشت به حالت قبل رو بنویسی.

دو روش رایج:

  • دادن مقدار معکوس تغییر به addOptimistic.

  • یا گرفتن دوباره ی وضعیت از سرور.

مزایای هوک useOptimistic در React چیه ؟

  • تجربه ی کاربری بهتر: کاربر نتیجه رو همون لحظه میبینه.

  • کد تمیزتر: نیاز به چند تا useState برای حالت موقت نداری.

  • احساس سرعت بیشتر: تاخیر سرور حس نمیشه.

معایب هوک useOptimistic در React چیه ؟

  • برای عملیات حساس مثل تراکنش های مالی مناسب نیست.

  • نیاز به مدیریت خطای دستی داری.

جمع بندی

useOptimistic یه ابزار خفن برای ساختن UI سریع و واکنش گراست. اگه پروژه ات نیاز به نمایش سریع تغییرات داره و میتونی خطاها رو مدیریت کنی، این هوک میتونه تجربه ی کاربر رو خیلی بهتر کنه.

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

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

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

پست های مرتبط

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

11 مهر 1404

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

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

19 مرداد 1404

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

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

18 مرداد 1404

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

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

15 مرداد 1404

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

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

13 مرداد 1404

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

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

2 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • الهه متقین گفت:
    19 مرداد 1404 در 16:15

    خیلی ساده و روان و کافی بود ممنونم

    پاسخ
    • احمد احمدنژاد گفت:
      21 مرداد 1404 در 10:57

      زنده باشی الهه عزیز خوشحالم که مفید بوده برات 🙂

      پاسخ

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

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

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

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

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