useOptimistic
useOptimistic
adalah React Hook yang memungkinkan Anda memperbarui antarmuka pengguna (UI) secara optimis.
const [optimisticState, addOptimistic] = useOptimistic(state, updateFn);
Reference
useOptimistic(state, updateFn)
useOptimistic
adalah React Hook yang memungkinkan Anda menampilkan state yang berbeda pada saat aksi asinkron sedang berlangsung. Hook ini menerima beberapa state sebagai argumen dan mengembalikan salinan dari state tersebut yang bisa berbeda selama aksi asinkron seperti contoh network request. Anda dapat menyediakan sebuah function yang mengambil state saat ini dan input untuk aksi tersebut, dan mengembalikan optimistic state yang akan digunakan saat aksi tersebut tertunda.
State ini disebut sebagai “optimistic” state karena biasanya digunakan untuk segera menampilkan hasil dari aksi yang dilakukan pengguna, meskipun aksi tersebut sebenarnya memerlukan waktu untuk diselesaikan.
import { useOptimistic } from 'react';
function AppContainer() {
const [optimisticState, addOptimistic] = useOptimistic(
state,
// updateFn
(currentState, optimisticValue) => {
// merge and return new state
// with optimistic value
}
);
}
Parameters
state
: nilai yang akan dikembalikan di awal dan setiap kali tidak ada tindakan yang tertunda.updateFn(currentState, optimisticValue)
: sebuah function yang menerimastate
saat ini dan optimistic value yang diteruskan keaddOptimistic
dan mengembalikan optimistic state yang dihasilkan. Function ini harus berupa function murni.updateFn
menerima 2 parameter yaitucurrentState
danoptimisticValue
. Nilai yang dikembalikan akan menjadi nilai gabungan daricurrentState
danoptimisticValue
.
Returns
optimisticState
: Hasil optimistic state. Nilai ini sama denganstate
kecuali jika ada aksi yang tertunda, dalam hal ini nilainya sama dengan nilai yang dikembalikan olehupdateFn
.addOptimistic
:addOptimistic
adalah dispatch function yang dipanggil ketika Anda memiliki optimistic update. Function ini menerima satu argumen,optimisticValue
, dengan tipe apapun dan akan memanggilupdateFn
denganstate
danoptimisticValue
.
Usage
Optimistically updating forms
Hook useOptimistic
menyediakan cara untuk memperbarui antarmuka pengguna secara optimis sebelum operasi latar belakang, seperti network request. Dalam konteks form, teknik ini membantu membuat aplikasi terasa lebih responsif. Ketika seorang pengguna mengirimkan form, alih-alih menunggu respons dari server untuk merefleksikan perubahan, antarmuka akan langsung diperbarui dengan hasil yang diharapkan.
Misalnya, ketika seorang pengguna mengetik pesan ke dalam form dan menekan tombol “Send”, Hook useOptimistic
memungkinkan pesan tersebut segera muncul dalam daftar dengan label “Sending…”, bahkan sebelum pesan tersebut benar-benar terkirim ke server. Pendekatan “optimistic” ini memberikan kesan kecepatan dan responsivitas. Form tersebut kemudian mencoba untuk benar-benar mengirim pesan tersebut di latar belakang. Setelah server mengonfirmasi bahwa pesan telah diterima, label “Sending…” akan dihapus.
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} />; }