Server Actions + useOptimistic
formActionパターンとuseActionStateの組み合わせ
実装パターン
// Server Action
"use server";
export async function submitMessage(prevState, formData) {
const text = formData.get("text");
await saveToDatabase(text);
return { success: true, data: { text } };
}
// Client Component
const [state, formAction, isPending] = useActionState(submitMessage, initialState);
const [optimistic, addOptimistic] = useOptimistic(messages, ...);
<form action={(formData) => {
addOptimistic({ text: formData.get("text"), pending: true });
formAction(formData);
}}>
<input name="text" />
<button disabled={isPending}>送信</button>
</form>メッセージ送信
formAction + useActionState
isPending:false
メッセージ一覧
楽観的に追加されたメッセージ
メッセージはまだありません
確認ポイント
- • useActionState: Server Actionの状態(success, message)を管理
- • isPending: Server Action実行中かどうかを示すフラグ
- • formAction: form要素のaction属性に渡す関数
- • 「error」を含むメッセージを送信するとエラーを確認できます