コース一覧
Next.jsフルスタック:サーバー・データ取得・API
フォーム実装

Next.jsフルスタック:サーバー・データ取得・API

Server ComponentsとClient Components、use client、サーバーfetch、asyncコンポーネント、動的ルート、params、notFound、キャッシュ、Route Handler、GET・POST API、Server Actions、フォームを扱う全24レッスンのフルスタックコースです。fleamaの商品取得と出品機能をNext.js内へ実装します。

1
Server / Client Components
01. サーバーで動く部品10分
02. Server Components15分
03. use clientの宣言15分
04. どちらに置くか15分
05. 境界をまたぐ合成15分
06. 境界の設計15分
07. つくる - 部品の仕分け20分
08. 第4章クイズ15分
2
データ取得と動的ルート
01. サーバーでfetch15分
02. asyncコンポーネント15分
03. 動的ルート15分
04. paramsを受け取る15分
05. notFoundで404にする15分
06. キャッシュのきほん10分
07. 検索をサーバーで15分
08. つくる - サーバー取得化20分
09. 第5章クイズ15分
3
API Routesとフォーム
01. Route Handler15分
02. GET APIを作る15分
03. POST APIを作る15分
04. Server Actionsの触り15分
05. フォーム実装15分
06. つくる - 受け口の完成20分
07. 第6章クイズ15分

フォーム実装

送信の3手

送ってから返事が来るまで

受け口はもう作りました。今度は送る側です。送信ボタンを押してから返事が届くまでには、必ず少しの間があります。その間を放っておくと、受講生が押したかどうか分からず、二度三度と押してしまいます。

だからフォームの状態を3つに分けて持ちます。まだ送っていない、送っている最中、終わった、の3つです。

TypeScript (JSX)

const [status, setStatus] = useState("idle");

送り始めたら sending、返事が来たら done に変えます。ボタンは disabled={status === "sending"} にしておけば、返事待ちのあいだ押せなくなります。

送信の処理

フォームの送信は onSubmit で受けます。最初にやるのは event.preventDefault() です。これを書かないと、ブラウザがページごと再読み込みしてしまい、書いた処理が最後まで走りません。

TypeScript (JSX)

async function handleSubmit(event: React.FormEvent<HTMLFormElement>) { event.preventDefault(); setStatus("sending"); const form = new FormData(event.currentTarget); const res = await fetch("/api/contact", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ name: form.get("name"), body: form.get("body") }), }); const data = await res.json(); setStatus("done"); setMessage(data.message); }

new FormData(event.currentTarget) で、フォームの中の入力をまとめて取り出せます。入力の1つずつに useState を置かなくても、name 属性さえ付いていれば読めます。

完了の見せ方

返事が届いたら、送った人が「終わった」と分かる表示に切り替えます。入力欄をそのまま残して小さく文字を足すだけだと気付かれにくいので、完了したことをはっきり出します。

TypeScript (JSX)

{status === "done" ? <p className="contact-done">送信が完了しました</p> : null}

断られたときは、何が足りなかったのかをそのまま見せます。res.ok が false のときにサーバーが返した error を表示すれば、受け口で書いた検証の文がそのまま案内になります。

演習

問い合わせフォームの送信処理を書いて、完了表示まで通します。

ヒント

入力は const form = new FormData(event.currentTarget); でまとめて読めます

送る中身は JSON.stringify({ name: form.get("name"), body: form.get("body") }) です

headers に { "content-type": "application/json" } を付けます

受け口は成功なら message を、失敗なら error を返します。res.ok で分けます

route.ts
page.tsx
layout.tsx
プレビュー

できているか

  • 送信ボタンが出ている
  • 入れて送ると完了表示に変わる
  • 既定の送信を止めている
  • 送信中の状態を持たせている
  • 受け口に送っている
エディタを読み込んでいます