stock.dev
Next.jsの勉強会 vol.5 フォームとuseState

Next.jsの勉強会 vol.5 フォームとuseState

·4 min read

今回学ぶこと

Reactのフォームでは、入力値をstateとして持ち、送信時に自分で処理を行う。 今回は練習として次の流れを実装してみる。

inputの値をstateに入れる

formの送信を止める

入力必須チェックをする

送信後のメッセージを表示する

inputの値をstateに入れる

まず、名前入力用のstateを作った。

const [name, setName] = useState<string>("");

nameは現在入力されている文字列。 setNameは、nameを更新するための関数。

inputにはvalueonChangeを設定した。

<input
  value={name}
  onChange={(event) => setName(event.target.value)}
/>

value={name}で、inputにReactのstateを表示する。 onChangeは、入力内容が変わるたびに実行されるイベント。 event.target.valueには、今inputに入力されている文字列が入っている。

onChange={(event) => setName(event.target.value)}

このコードにより、入力するたびにnamestateが更新される。

入力内容に応じて表示を変える

nameがあるときだけ、挨拶文を表示した。

{name && (
  <p className="mt-3 text-sm text-zinc-300">{name}さん、こんにちは。</p>
)}

これは「nameが空ではないときだけ表示する」という意味。

formの送信を止める

HTMLのformは、送信するとページを再読み込みしようとする。 Reactでは、多くの場合この標準動作を止めて、自分で送信処理を書く。

function handleSubmit(event: React.SyntheticEvent<HTMLFormElement>) {
  event.preventDefault();
}

event.preventDefault()は、formの標準送信を止めるための処理である。 event: React.SyntheticEvent<HTMLFormElement>は、formで起きたReactのイベントを受け取るための型である。

onSubmitで送信処理を呼ぶ

formにonSubmitを設定した。

<form className="mt-6" onSubmit={handleSubmit}>

送信ボタンはtype="submit"にする。

<button type="submit">詳細を見る</button>

このボタンを押すと、formのonSubmitが実行され、handleSubmitが呼ばれる。

入力必須チェック

練習として、名前が空の場合は送信処理を止めるようにした。

if (!name) {
  alert("お名前を入力してください");
  return;
}

送信完了UIを表示する

送信できたかどうかを管理するstateを作った。

const [isSubmitted, setIsSubmitted] = useState<boolean>(false);

送信に成功したらtrueにする。

setIsSubmitted(true);

そして、isSubmittedがtrueのときだけメッセージを表示する。

{isSubmitted && (
  <p className="mt-4 bg-teal-900/40 p-4 text-sm text-teal-100">
    {name}さん、送信準備ができました。
  </p>
)}