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 مقداری را برمیگرداند. و سپس ارزش به لیست واقعی کتاب ها اضافه می شود.