useOptimistic הוא React Hook שמאפשר לעדכן את ה-UI באופן אופטימי.
const [optimisticState, addOptimistic] = useOptimistic(state, updateFn);Reference
useOptimistic(state, updateFn)
useOptimistic הוא React Hook שמאפשר להציג state שונה בזמן שפעולה אסינכרונית מתבצעת. הוא מקבל state כארגומנט ומחזיר עותק של אותו state שיכול להיות שונה במשך הפעולה האסינכרונית, למשל בקשת רשת. אתם מספקים פונקציה שמקבלת את ה-state הנוכחי ואת קלט הפעולה, ומחזירה את ה-state האופטימי שישמש בזמן שהפעולה ממתינה.
ה-state הזה נקרא “אופטימי” כי בדרך כלל משתמשים בו כדי להציג למשתמש מיד את תוצאת הפעולה, למרות שבפועל הפעולה לוקחת זמן להשלים.
import { useOptimistic } from 'react';
function AppContainer() {
const [optimisticState, addOptimistic] = useOptimistic(
state,
// updateFn
(currentState, optimisticValue) => {
// merge and return new state
// with optimistic value
}
);
}Parameters
state: הערך שיוחזר בתחילה ובכל פעם שאין פעולה ממתינה.updateFn(currentState, optimisticValue): פונקציה שמקבלת את ה-state הנוכחי ואת הערך האופטימי שמועבר ל-addOptimistic, ומחזירה את ה-state האופטימי המתקבל. זו חייבת להיות פונקציה טהורה.updateFnמקבלת שני פרמטרים:currentStateו-optimisticValue. הערך המוחזר יהיה הערך הממוזג שלcurrentStateו-optimisticValue.
Returns
optimisticState: ה-state האופטימי המתקבל. הוא שווה ל-stateאלא אם יש פעולה ממתינה, ובמקרה כזה הוא שווה לערך שהוחזר מ-updateFn.addOptimistic: פונקציית dispatch לקריאה כשיש עדכון אופטימי. היא מקבלת ארגומנט אחד,optimisticValue, מכל סוג, ותיקרא ל-updateFnעםstateו-optimisticValue.
שימוש
עדכון אופטימי של טפסים
ה-Hook useOptimistic מספק דרך לעדכן את ממשק המשתמש באופן אופטימי לפני שפעולת רקע, כמו בקשת רשת, מסתיימת. בהקשר של טפסים, הטכניקה הזו עוזרת לאפליקציות להרגיש תגובתיות יותר. כשמשתמש שולח טופס, במקום להמתין לתגובה מהשרת כדי לשקף את השינויים, הממשק מתעדכן מיד עם התוצאה הצפויה.
לדוגמה, כשמשתמש מקליד הודעה בטופס ולוחץ על כפתור “Send”, ה-Hook useOptimistic מאפשר להודעה להופיע מיד ברשימה עם תווית “Sending…”, עוד לפני שההודעה באמת נשלחת לשרת. הגישה ה”אופטימית” הזו יוצרת תחושת מהירות ותגובתיות. לאחר מכן הטופס מנסה באמת לשלוח את ההודעה ברקע. כשהשרת מאשר שההודעה התקבלה, תווית “Sending…” מוסרת.
import { useOptimistic, useState, useRef } from "react"; import { deliverMessage } from "./actions.js"; function Thread({ messages, sendMessage }) { const formRef = useRef(); async function formAction(formData) { addOptimisticMessage(formData.get("message")); formRef.current.reset(); await sendMessage(formData); } const [optimisticMessages, addOptimisticMessage] = useOptimistic( messages, (state, newMessage) => [ ...state, { text: newMessage, sending: true } ] ); return ( <> {optimisticMessages.map((message, index) => ( <div key={index}> {message.text} {!!message.sending && <small> (Sending...)</small>} </div> ))} <form action={formAction} ref={formRef}> <input type="text" name="message" placeholder="Hello!" /> <button type="submit">Send</button> </form> </> ); } export default function App() { const [messages, setMessages] = useState([ { text: "Hello there!", sending: false, key: 1 } ]); async function sendMessage(formData) { const sentMessage = await deliverMessage(formData.get("message")); setMessages((messages) => [...messages, { text: sentMessage }]); } return <Thread messages={messages} sendMessage={sendMessage} />; }