برنامه نویسی

React 19 مثال قلاب new useOptimistic().

یک نمونه کار

این پست مربوط به این مثال است. می توانید فقط کد را ببینید یا این مقاله را بخوانید که گام به گام توضیح می دهد که در برنامه کوچک چه اتفاقی می افتد.

برنامه react جدید ایجاد کنید

اول از همه برنامه React جدید ایجاد کنید. اگر Vite را دوست دارید می توانید از دستور زیر استفاده کنید.

npm create vite@latest
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مواد آزمایشی

در ضمن من دارم مینویسم قلاب هنوز تجربیه. در نسخه قناری React 19 بنابراین … برای افزودن قلاب به پروژه به بسته های بیشتری نیاز داریم.

npm install react@^0.0.0-experimental-6f23540c7d-20240528 \
react-dom@^0.0.0-experimental-6f23540c7d-20240528 \
uuid@^9.0.1 \
@types/react@18.3 \
@types/react-dom@18.3
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

وارد كردن

واردات بدیهی است …

import { useOptimistic, useState } from "react";
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

داده ها

در این مثال به کتاب ها می پردازیم. زیرا این مثال بخشی از کتابی است که من (فقط به زبان ایتالیایی) درباره Reacct 19 می نویسم.

type Book = { text: string; sending: boolean; key?: number };
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تماس استراحت

در یک نقطه، مثال کوچک برخی از api را صدا می کند. برای سادگی، تاخیر شبکه را با یک Promise شبیه سازی می کنم. همچنین، من شبیه‌سازی می‌کنم که تماس واقعی مقداری را به‌روزرسانی می‌کند که «محتوا از rest api» را اضافه می‌کند، مانند api rest در حال برگرداندن داده‌های به‌روز/فیلتر/تثبیت‌شده…

const createNewBook = async (message: FormDataEntryValue | null) => {
  await new Promise((resolve) => setTimeout(resolve, 1000));
  return message + " content from rest api";
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برنامه

اینجا هستیم!! برنامه شامل فهرستی از کتاب ها است. React، TypeScript و Next.js قبلا نوشته شده است. React… یک پیشرفت کاری است… برنامه فهرستی از کتاب ها را ایجاد می کند. تابعی که داده ها را به یک api ارسال می کند و سپس نتیجه را به کتاب ها اضافه می کند.

export default function App() {
  const [books, setBooks] = useState<Book[]>([
    { text: "React", sending: false, key: 1 },
    { text: "React, TypeScript e Next.js", sending: false, key: 3 },
  ]);

  async function sendMessage(formData: FormData) {
    const sentMessage = await createNewBook(formData.get("message"));
    setBooks((messages: any) => [...messages, { text: sentMessage }]);
  }

  return <Library books={books} createBook={sendMessage} />;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کتابخانه

نکته اصلی این مقاله جزء است . بیایید یک قدم به عقب برگردیم. داده هایی که ما با آنها کار می کنیم کتاب هستند. و کتاب ها به این صورت ذخیره می شوند:

type Book = { text: string; sending: boolean; key?: number };
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر زمان که ارسال درست باشد، (Sending...) بعد از کتاب جدید ظاهر می شود. و ارسال در آرایه کتابی که قبلاً دیده ایم نادرست است.

  const [books, setBooks] = useState<Book[]>([
    { text: "React", sending: false, key: 1 },
    { text: "React, TypeScript e Next.js", sending: false, key: 3 },
  ]);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همچنین یک فرم برای اضافه کردن عنوان جدید به فهرست کتاب اضافه می کنیم.

function Library(/** some params */) {
  /** some contents */

  return (
    <>
      {optimisticContent.map(
        (message: { text: string; sending: boolean }, index: number) => (
          <div key={index}>
            {message.text}
            {!!message.sending && <small> (Sending...)</small>}
          </div>
        )
      )}

      <form action={formAction}>
        <input type="text" name="message" placeholder="Hello!" />
        <button type="submit">Send</button>
      </form>
    </>
  );
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اقدام را شکل دهید

فرم داده ها را به formAction() تابع. سپس تابع محتوا را به لیست کتاب اضافه می کند و فرم را به یک api خارجی ارسال می کند. (از تخیل در مورد api خارجی استفاده کنید).

  async function formAction(formData: FormData) {
    addContent(String(formData.get("message")));
    await sendMessage(formData);
  }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده خوشبینانه

با این نحو ما پیکربندی می کنیم optimisticContent به عنوان محتوای خوش بینانه به عنوان مثال، هنگامی که متد addContent فراخوانی می شود، کتاب جدیدی دریافت می کند که Book را با sending=true علامت گذاری می کند.

  const [optimisticContent, addContent] = useOptimistic(
    messages,
    (state: Book[], newMessage: string) => [
      ...state,
      {
        text: newMessage,
        sending: true,
      },
    ]
  );
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد کامل

function Library({
  books: messages,
  createBook: sendMessage,
}: {
  books: Book[];
  createBook: (formData: FormData) => void;
}) {
  async function formAction(formData: FormData) {
    addContent(String(formData.get("message")));
    await sendMessage(formData);
  }

  const [optimisticContent, addContent] = useOptimistic(
    messages,
    (state: Book[], newMessage: string) => [
      ...state,
      {
        text: newMessage,
        sending: true,
      },
    ]
  );

  return (
    <>
      {optimisticContent.map(
        (message: { text: string; sending: boolean }, index: number) => (
          <div key={index}>
            {message.text}
            {!!message.sending && <small> (Sending...)</small>}
          </div>
        )
      )}

      <form action={formAction}>
        <input type="text" name="message" placeholder="Hello!" />
        <button type="submit">Send</button>
      </form>
    </>
  );
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از سرگیری

وقتی از فرمی برای ارسال کتاب جدید به فهرست کتاب ها استفاده می کنید، formAction روش اضافه کردن آیتم به لیست خوش بینانه. سپس داده ها را برای مثال به یک api ارسال کنید. پس از مدتی، api مقداری را برمی‌گرداند. و سپس ارزش به لیست واقعی کتاب ها اضافه می شود.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا