デモ

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」を含むメッセージを送信するとエラーを確認できます