HTML、CSS、JavaScriptReactの基礎

【React】コンポーネント開発(フォーム)を解説

Reactコンポーネント開発(フォーム)解説ページのアイキャッチ画像 HTML、CSS、JavaScript

本記事は、Reactでのフォーム開発における基本的な概念から高度な実装テクニックまでを網羅しています。従来のStateを使用したフォーム管理の方法から、React Hook Formライブラリを活用した効率的なフォーム開発まで、段階的に解説しています。

はじめに

Reactの基礎の記事一覧はクリックすると表示されます。

Reactは、Node.jsが必要です。インストールがまだの方はこちらを確認してください。

開発環境は、VSCodeがおすすめです。

フォーム操作の基本

単一の入力フィールドを持つ基本的なフォームを作成しています。useStateフックを使用して入力値を管理し、フォーム送信時にアラートを表示します。

  • App.js
JSX
import React, { useState } from "react";

// Appコンポーネントの定義
function App() {
  // 名前を保持するためのstate変数とその更新関数
  const [name, setName] = useState("");

  // フォーム送信時のハンドラー関数
  const handleSubmit = (e) => {
    e.preventDefault(); // デフォルトのフォーム送信動作を防止
    alert(`Hello, ${name}!`); // 入力された名前でアラートを表示
  };

  // コンポーネントのレンダリング
  return (
    <div>
      <h2>基本的なフォーム</h2>
      {/* フォーム要素 */}
      <form onSubmit={handleSubmit}>
        {/* 入力フィールド */}
        <input
          type="text"
          value={name} // stateの値を表示
          onChange={(e) => setName(e.target.value)} // 入力値でstateを更新
          placeholder="名前を入力"
        />
        {/* 送信ボタン */}
        <button type="submit">送信</button>
      </form>
    </div>
  );
}

export default App; // Appコンポーネントをエクスポート

出力結果:フォームに入力後、送信を押すとアラートが表示されます。

  1. import
    • React: Reactライブラリの本体をインポートしています。
    • useState: Reactのフックの一つで、コンポーネント内で状態(state)を管理するために使用します。
  2. App コンポーネント
    • 状態(State)の定義
      • useStateフックを使用して、nameという状態変数と、それを更新するためのsetName関数を作成しています。
      • 初期値は空の文字列("")です。
    • イベントハンドラ
      • handleSubmitは、フォームが送信されたときに実行される関数です。
      • e.preventDefault()でフォームのデフォルトの送信動作を防止しています。
      • 入力された名前を使ってアラートを表示します。
    • JSXの返却(return)
      • コンポーネントが画面に表示する内容をJSXで記述しています。
      • <form>要素にonSubmitイベントハンドラを設定しています。
      • <input>要素のvaluename状態変数を、onChangeに状態を更新する関数を設定しています。
  3. export
    • Appコンポーネントをデフォルトエクスポートしています。これにより、他のファイルでこのコンポーネントを簡単にインポートできます。

動作の流れ:

  1. コンポーネントが初期化され、nameの初期値が空文字列になる。
  2. ユーザーが入力フィールドに文字を入力する。
  3. 入力のたびにonChangeイベントが発火し、setName関数が呼び出される。
  4. nameの状態が更新され、コンポーネントが再レンダリングされる。
  5. ユーザーが送信ボタンをクリックする。
  6. handleSubmit関数が実行され、アラートが表示される。

これらの概念を理解することで、Reactでのフォーム処理の基本を掴むことができます。

Stateにおける構造化データの更新

複数の入力フィールドの値を単一のオブジェクトで管理しています。handleChange関数を使用して、各フィールドの変更を効率的に処理します。

  • App.js
JSX
import React, { useState } from 'react';

function App() {
  // フォームデータを管理するためのstate
  const [formData, setFormData] = useState({
    name: '',
    email: '',
  });

  // 入力フィールドの変更を処理する関数
  const handleChange = (e) => {
    const { name, value } = e.target;
    // 新しい値で状態を更新し、他のフィールドはそのまま保持
    setFormData(prevData => ({
      ...prevData,
      [name]: value
    }));
  };

  // フォーム送信を処理する関数
  const handleSubmit = (e) => {
    e.preventDefault(); // デフォルトの送信動作を防止
    console.log('フォームデータ:', formData); // フォームデータをコンソールに出力
  };

  return (
    <div>
      <h2>構造化データのフォーム</h2>
      <form onSubmit={handleSubmit}>
        {/* 名前入力フィールド */}
        <input
          type="text"
          name="name"
          value={formData.name}
          onChange={handleChange}
          placeholder="名前"
        />
        {/* メールアドレス入力フィールド */}
        <input
          type="email"
          name="email"
          value={formData.email}
          onChange={handleChange}
          placeholder="メールアドレス"
        />
        {/* 送信ボタン */}
        <button type="submit">送信</button>
      </form>
    </div>
  );
}

export default App;

出力結果:フォームに入力後、送信を押すとコンソール画面にデータが出力されます。

  1. import
    • React: Reactライブラリの本体をインポートしています。
    • useState: Reactのフックで、コンポーネント内で状態(state)を管理するために使用します。
  2. App コンポーネント
    • 状態(State)の定義
      • useStateフックを使用して、formDataというオブジェクト型の状態と、それを更新するためのsetFormData関数を作成しています。
      • 初期値はnameemailプロパティを持つオブジェクトです。
    • イベントハンドラ
      • handleChangeは、入力フィールドの変更を処理する関数です。
      • スプレッド構文...prevData)を使用して、既存のデータを保持しつつ、変更されたフィールドのみを更新しています。
      • handleSubmitは、フフォーム送信時に実行される関数です。
      • フォームのデフォルト送信動作を防止し、データをコンソールに出力します。
    • JSXの返却(return)
      • コンポーネントのUI構造をJSXで定義しています。
      • <input>要素のvalueonChangeプロパティを使って、制御されたコンポーネントを作成しています。
  3. export
    • Appコンポーネントをデフォルトエクスポートしています。これにより、他のファイルでこのコンポーネントを簡単にインポートできます。

動作の流れ:

  1. コンポーネントが初期化され、formDataの初期値が設定される。
  2. ユーザーが入力フィールドに文字を入力する。
  3. 入力のたびにhandleChange関数が呼び出され、formDataの状態が更新される。
  4. 状態の更新により、コンポーネントが再レンダリングされる。
  5. ユーザーが送信ボタンをクリックする。
  6. handleSubmit関数が実行され、フォームデータがコンソールに出力される。

これらの概念を理解することで、Reactでの複数フィールドを持つフォーム処理の基本を掴むことができます。

検証機能の実装 – React Hook Form

React Hook Formを使用して簡単にフォームの検証を実装しています。名前とメールアドレスのフィールドに対して、必須チェックや形式チェックを行っています。エラーメッセージは自動的に表示されます。

React Hook Formライブラリのインストール

まず、react-hook-formがインストール済みかどうかを確認します。

  • ローカルインストール:
    プロジェクト単位でreact-hook-formをインストールする場合(これが一般的)、sudo や管理者権限は不要です。
  • グローバルインストールの非推奨:
    ライブラリをグローバルにインストールすることは一般的に推奨されていません。プロジェクト固有の依存関係を管理する方が良いプラクティスです。
  1. コマンドプロンプトまたは、ターミナルを開きます。
  2. ※プロジェクトのルートディレクトリに移動します。
注意点
  • コマンドを実行する前に、プロジェクトのルートディレクトリにいることを確認してください。

Windows, macOS, Linux 共通:

  1. インストール済みかどうかの確認:
npm list react-hook-form

もし react-hook-form がインストールされていない場合は、以下のようなメッセージが表示されます。

(empty)

または

react-hook-form@* could not be found

一方、インストールされている場合は、以下のようなメッセージが表示されます(バージョン番号は異なる可能性があります):

react-hook-form@7.53.1
  1. インストール:
npm install react-hook-form
  1. 特定のバージョンをインストール(例:バージョン7.43.9):
npm install react-hook-form@7.43.9
  1. アンインストール:
npm uninstall react-hook-form

react-hook-formがインストールのされていない場合、ブラウザの画面に以下のエラーが表示されます。

検証機能の実装例

  • App.js
JSX
import React from 'react';
import { useForm } from 'react-hook-form';

function App() {
  // React Hook Formのフック使用
  const { register, handleSubmit, formState: { errors } } = useForm();

  // フォーム送信時の処理
  const onSubmit = (data) => {
    console.log('検証済みデータ:', data);
  };

  return (
    <div>
      <h2>React Hook Formを使用した検証付きフォーム</h2>
      {/* handleSubmitでonSubmit関数をラップ */}
      <form onSubmit={handleSubmit(onSubmit)}>
        {/* 名前入力フィールド */}
        <input
          {...register("name", { 
            required: "名前は必須です", // 必須フィールド
            minLength: { value: 2, message: "名前は2文字以上で入力してください" } // 最小長さ検証
          })}
          placeholder="名前"
        />
        {/* 名前フィールドのエラーメッセージ表示 */}
        {errors.name && <p>{errors.name.message}</p>}

        {/* メールアドレス入力フィールド */}
        <input
          {...register("email", { 
            required: "メールアドレスは必須です", // 必須フィールド
            pattern: {
              value: /^\S+@\S+$/i, // メールアドレスの形式を正規表現で検証
              message: "有効なメールアドレスを入力してください"
            }
          })}
          placeholder="メールアドレス"
        />
        {/* メールアドレスフィールドのエラーメッセージ表示 */}
        {errors.email && <p>{errors.email.message}</p>}

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

export default App;

これらの例は、Reactでのフォーム操作の基本から、より高度な検証機能の実装まで、段階的に理解を深めることができるよう設計されています。各ステップで、コードの複雑さが増していきますが、フォーム処理の機能も向上していきます。

出力結果:

  • 空欄で「送信」ボタンを押した場合:
  • 2文字以下で「送信」ボタンを押した場合:
  • 正しい入力で「送信」ボタンを押した場合:コンソール画面にデータが表示されます。
  1. import
    • React: Reactライブラリの本体をインポートしています。
    • useState: Reactのフックで、コンポーネント内で状態(state)を管理するために使用します。
  2. App コンポーネント
    • 状態(State)の定義
      • useFormフックを呼び出し、フォーム管理に必要な関数やオブジェクトを取得しています。
      • register: 入力フィールドを登録し、検証ルールを設定する関数
      • handleSubmit: フォーム送信を処理する関数
      • errors: フォームの検証エラーを含むオブジェクト
    • フォーム送信処理
      • onSubmitは、フォームが正常に送信された時に呼び出される関数です。
      • 検証済みのデータをコンソールに出力します。
    • JSXの返却(return)
      • フォームのUI構造をJSXで定義しています。
      • register関数を使用して各入力フィールドを登録し、検証ルールを設定しています。
      • エラーメッセージを条件付きでレンダリングしています。
  3. export
    • Appコンポーネントをデフォルトエクスポートしています。これにより、他のファイルでこのコンポーネントを簡単にインポートできます。

動作の流れ:

  1. コンポーネントが初期化され、useFormフックが呼び出される。
  2. ユーザーが入力フィールドに文字を入力する。
  3. 入力値がリアルタイムで検証される。
  4. エラーがある場合、対応するエラーメッセージが表示される。
  5. ユーザーが送信ボタンをクリックする。
  6. 全ての検証が通過した場合のみ、onSubmit関数が呼び出される。
  7. 検証済みデータがコンソールに出力される。

これらの概念を理解することで、React Hook Formを使用した効率的なフォーム処理と検証の基本を掴むことができます。

まとめ

  • Reactにおける基本的なフォーム操作の方法
  • Stateを使用した構造化データの更新テクニック
  • React Hook Formの導入方法と基本的な使用方法
  • React Hook Formを使用した高度な検証機能の実装方法

React Hook Formの導入により、フォーム開発の複雑さが大幅に軽減されることが分かります。特に、検証機能の実装が簡素化され、コードの可読性と保守性が向上します。また、パフォーマンスの面でも従来のState管理よりも優れていることが示されています。

この記事を通じて、開発者はReactでのフォーム開発における様々なアプローチを学び、プロジェクトの要件に応じて最適な手法を選択できるようになります。React Hook Formの活用は、特に大規模なフォーム複雑な検証ロジックを必要とするプロジェクトで威力を発揮するでしょう。

コメント

タイトルとURLをコピーしました