0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

react-hook-formでのフォーム作成

Last updated at Posted at 2023-12-12

react-hook-formとは?

Reactでフォームを簡単に扱うためのパフォーマンス向上と使いやすさを提供するライブラリです

インストール方法

npmを使用する場合:

npm install react-hook-form

または、yarnを使用する場合:

yarn add react-hook-form

フォームを実装

例として、名前とメールアドレスを含むシンプルなフォームを考えます。
(公式サイトに行けばちょこちょこサンプルあり)

import React from 'react';
import { useForm, Controller } from 'react-hook-form';

const MyForm = () => {
  // useForm フックを使用してフォームを初期化
  const { handleSubmit, control, register, formState: { errors } } = useForm();

  // フォームが送信されたときに実行される関数
  const onSubmit = (data) => {
    console.log(data);
    // ここでデータを使用して何かしらの処理を行う
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* 名前の入力フィールド */}
      <div>
        <label>名前</label>
        <input {...register('name', { required: '名前は必須です' })} />
        {errors.name && <p>{errors.name.message}</p>}
      </div>

      {/* メールアドレスの入力フィールド */}
      <div>
        <label>メールアドレス</label>
        <Controller
          render={({ field }) => <input {...field} />}
          control={control}
          name="email"
          rules={{ required: 'メールアドレスは必須です', pattern: { value: /^\S+@\S+$/i, message: '有効なメールアドレスを入力してください' } }}
        />
        {errors.email && <p>{errors.email.message}</p>}
      </div>

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

export default MyForm;

useFormを使用してフォームを初期化し、各入力フィールドにregisterを使用して登録します。また、メールアドレスの入力フィールドではControllerを使用しています。フォームが送信されたときには、onSubmit関数が呼ばれます。
(useFormから必要な関数?をとってきて定義するようなイメージ??)

この例は基本的なものであり、実際のプロジェクトではさらに複雑なバリデーションやフォームの状態管理が必要になるかもしれません。
React Hook Formの公式ドキュメントを参照すると、より詳細で高度な使い方が学べます。

Controllerとは?

Controllerは、React Hook Formの一部であり、外部のライブラリとReact Hook Formを統合するために使用されます。具体的には、外部のUIライブラリやカスタムコンポーネントとReact Hook Formを連携させる役割を果たします。主に、制御されたコンポーネント(Controlled Component)のプロパティと状態をReact Hook Formに紐付け、バリデーションやフォームの状態管理を容易にします。

以下に、Controllerの主な役割をいくつか説明します:

外部コンポーネントの制御(Control):
Controllerは外部のカスタムコンポーネントやUIライブラリのフォーム要素をラップし、そのコンポーネントの値をReact Hook Formに制御させます。これにより、外部のコンポーネントもReact Hook Formの一部として扱うことができます。

バリデーションの設定:
Controllerを使用すると、rulesプロパティを通じてバリデーションのルールを設定できます。例えば、必須フィールドや特定のパターンに一致するかどうかなどのバリデーションが可能です。

フォームの値の取得:
Controllerを使用すると、外部コンポーネントの値をReact Hook Formから取得することができます。これにより、外部コンポーネントの値をフォーム全体のデータと結びつけることができます。

<Controller
  render={({ field }) => <input {...field} />}
  control={control}
  name="email"
  rules={{ required: 'メールアドレスは必須です', pattern: { value: /^\S+@\S+$/i, message: '有効なメールアドレスを入力してください' } }}
/>

renderプロパティを使用してinput要素をラップし、fieldを通じてReact Hook Formに値を提供しています。controlプロパティは、useFormフックから取得したcontrolオブジェクトを指定し、nameプロパティでフォームデータのキーを指定しています。rulesプロパティではバリデーションルールを設定しています。

バリデーションではなく、警告文?みたいなメッセージを表示したいとき

バリデーションに関してはControllerで設定可能?
特定の値によってただメッセージだけ表示させて、注意喚起みたいなことがしたいとき
(あくまで参考程度、)

条件に基づくメッセージ表示: 条件に基づいて特定の条件が満たされた場合にメッセージを表示します。これにはJavaScriptの条件文や三項演算子を使用できます。

value1が特定の値の場合に赤いテキストでメッセージを表示しています。

<div>
  <label>Value1</label>
  <input
    {...register('value1')}
    type="text"
  />
  {watch('value1') === '特定の値' && (
    <p style={{ color: 'red' }}>特定の値は使用できません。</p>
  )}
</div>

状態を使用したメッセージ表示: react-hook-formの状態を使って特定の条件で状態を変更し、それに基づいてメッセージを表示します。

value1が特定の値の場合に状態 showMessage を true に変更し、それに基づいてメッセージを表示しています。

import { useState } from 'react';

function MyForm() {
  const { register, watch } = useForm();
  const [showMessage, setShowMessage] = useState(false);

  return (
    <div>
      <label>Value1</label>
      <input
        {...register('value1')}
        type="text"
        onChange={() => setShowMessage(watch('value1') === '特定の値')}
      />
      {showMessage && (
        <p style={{ color: 'red' }}>特定の値は使用できません。</p>
      )}
    </div>
  );
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?