Study Log

日々の学習のまとめ・備忘録

View on GitHub
7 December 2025

React 問合せフォーム

by Natsumi Chiba

Reactで問合せフォームを実装します。

// 画面にReactコンポーネントを描画するためのライブラリ
import ReactDOM from 'react-dom'
// React本体と、状態管理に使うuseStateフックを読み込む
import React, { useState } from 'react'

// Appコンポーネント(問い合わせフォーム全体)
const App = () => {
  // 入力された名前を保持するstate(初期値は空文字)
  const [customerName, setCustomerName] = useState('')
  // メールアドレス
  const [email, setEmail] = useState('')
  // メッセージ内容
  const [message, setMessage] = useState('')
  // 名前が未入力かどうかのフラグ
  const [isEmptyName, setIsEmptyName] = useState(false)

  // フォーム送信時に呼ばれる関数
  const handleSubmit = (e) => {
    e.preventDefault() // ページがリロードされる標準動作を止める

    // 名前が入力されているか判定
    if (customerName !== '') {
      // 入力があればアラートメッセージを表示
      alert(`${customerName}さん、メッセージが送信されました!`)
    } else {
      // 名前が空ならエラーメッセージを表示するためのフラグをON
      setIsEmptyName(true)
      return // ここで処理を止める
    }

    // フォーム送信後、入力欄を空にリセット
    setCustomerName('')
    setEmail('')
    setMessage('')
  }

  return (
    <>
      {/* フォームのタイトル */}
      <h1> お問合せフォーム </h1>

      {/* フォームタグ。送信時にhandleSubmitが実行される */}
      <form onSubmit={handleSubmit}>
        <div
          style=
        >
          {/* 名前入力欄のラベル */}
          <label style= htmlFor="name">
            お名前
          </label>

          {/* 名前入力欄 */}
          <input
            style=
            type="text"
            id="name"
            name="customer_name"
            // stateと入力欄を同期
            value={customerName}
            onChange={(e) => {
              setIsEmptyName(false) // エラー表示を消す
              setCustomerName(e.target.value) // 入力値をstateに反映
            }}
          />

          {/* 名前が未入力の時だけ表示されるエラーメッセージ */}
          {isEmptyName && (
            <span style=>
              お名前を入力してください
            </span>
          )}

          {/* メールアドレスのラベル */}
          <label style= htmlFor="email">
            メールアドレス
          </label>

          {/* メールアドレス入力欄 */}
          <input
            style=
            type="email"
            id="email"
            name="email"
            value={email} // stateと同期
            onChange={(e) => setEmail(e.target.value)} // 入力をstateに保存
          />

          {/* メッセージのラベル */}
          <label style= htmlFor="message">
            メッセージ
          </label>

          {/* メッセージ入力欄(複数行) */}
          <textarea
            style=
            type="text"
            id="message"
            name="message"
            value={message}
            onChange={(e) => setMessage(e.target.value)}
          />
        </div>

        {/* 送信ボタン */}
        <button style= type="submit">
          送信
        </button>
      </form>
    </>
  )
}

// AppコンポーネントをHTMLの#rootに描画
ReactDOM.createRoot(document.getElementById('root')).render(<App />)

ポイント

React では入力欄を「状態(state)」と同期させる
value={customerName}

onChange={(e) => setCustomerName(e.target.value)}
をセットで使うことで、

✔ 入力値が React の state に保存される
✔ 表示される値も state から取る

という双方向の仕組みが成り立っています。
これを Controlled Component(制御されたコンポーネント) と呼びます。


バリデーション(入力チェック)
if (customerName !== ‘’) {

未入力だったら state でフラグを立てる。
これでエラーメッセージの表示非表示が切り替わります。

tags: