2
2

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は、Reactでフォームを扱う際に非常に有用なライブラリです。フォームの状態管理を簡素化し、パフォーマンスの最適化も考慮されています。その中でも、フォームの値を監視するためのメソッドとしてwatchuseWatchがあります。

この記事では、watchuseWatchの違いと使い分けについて詳しく解説します。具体的なコード例を交えながら、それぞれの特徴や適切な使用シーンを理解していきましょう。

watchとuseWatchとは

watch

watchは、フォームの値をリアルタイムで監視するための関数です。フォーム全体、特定のフィールド、または複数のフィールドの値を取得できます。

const { register, watch } = useForm();

const value = watch(); // フォーム全体の値を取得
const firstName = watch('firstName'); // 特定のフィールドの値を取得
const selectedValues = watch(['firstName', 'lastName']); // 複数のフィールドの値を取得

特徴:

  • 同期的watchは現在のフォームの状態を即時に返します。
  • 再レンダリングwatch自体がコンポーネントの再レンダリングを引き起こさないため、パフォーマンス面で有利です。

useWatch

useWatchは、フォームの値を監視するためのReactフックです。指定したフィールドの値が変化すると、コンポーネントが再レンダリングされます。

const { control, register } = useForm();

const firstName = useWatch({
  control,
  name: 'firstName',
});

const selectedValues = useWatch({
  control,
  name: ['firstName', 'lastName'],
});

特徴:

  • リアクティブ:指定したフィールドの値が変化すると、コンポーネントが再レンダリングされます。
  • 柔軟性:フォームの状態に応じて動的なUIを構築する際に便利です。

watchとuseWatchの違い

watch useWatch
戻り値 現在の値を即時に返す フォームの値を監視し、値が変化すると再レンダリング
再レンダリングのトリガー なし(useEffectと組み合わせて手動でトリガー可能) 値の変更に応じて自動で再レンダリング
主な使用シーン 値の即時取得やバリデーション、イベントハンドラでの利用 コンポーネントの表示・非表示切り替え、動的なUI更新

実装例

シナリオ

ユーザーが入力したパスワードの強度をリアルタイムでチェックし、強度に応じてメッセージを表示するフォームを作成します。

watchを使用した実装

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

const PasswordForm = () => {
  const { register, watch } = useForm();

  // パスワードの値を即時取得
  const password = watch('password');

  // パスワードの強度を判定する関数
  const getPasswordStrength = (password: string) => {
    if (!password) return '';
    if (password.length > 8) return '強いパスワードです';
    return '弱いパスワードです';
  };

  return (
    <form>
      <input type="password" {...register('password')} placeholder="パスワードを入力" />
      <p>{getPasswordStrength(password)}</p>
    </form>
  );
};

export default PasswordForm;

解説:

  • watch('password')でパスワードの値を取得します。
  • パスワードの強度を判定し、メッセージを表示します。
  • 値の変化に応じて表示を更新するために、コンポーネント全体が再レンダリングされます。

useWatchを使用した実装

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

const PasswordForm = () => {
  const { control, register } = useForm();

  // useWatchでパスワードの値を監視
  const password = useWatch({
    control,
    name: 'password',
    defaultValue: '',
  });

  // パスワードの強度を判定する関数
  const getPasswordStrength = (password: string) => {
    if (!password) return '';
    if (password.length > 8) return '強いパスワードです';
    return '弱いパスワードです';
  };

  return (
    <form>
      <input type="password" {...register('password')} placeholder="パスワードを入力" />
      <p>{getPasswordStrength(password)}</p>
    </form>
  );
};

export default PasswordForm;

解説:

  • useWatchを使用して、passwordフィールドの値を監視します。
  • パスワードの値が変化すると、該当部分のみが再レンダリングされます。
  • パフォーマンスの最適化に寄与します。

適切な使い分け

watchを使うべき場合

  • 即時に値を取得したい場合:イベントハンドラ内や同期的な処理で値を取得する際に有効です。
  • Form全体のレンダリング:useFormを呼び出している箇所から再レンダリングされる。

useWatchを使うべき場合

  • 値の変化に応じてUIを更新したい場合:特定のフィールドの値に依存してコンポーネントを更新する際に有効です。
  • 最小限の再レンダリングuseWatchは依存している部分のみを再レンダリングするため、パフォーマンスの最適化につながります。

注意点

  • 再レンダリングのコストwatchを使用してフォーム全体を監視すると、コンポーネント全体が再レンダリングされる可能性があります。大量のフィールドがある場合、パフォーマンスに影響を与えることがあります。
  • デフォルト値の設定useWatchを使用する際、defaultValueを明示的に設定しないとundefinedになる可能性があります。

まとめ

  • watchはフォームの値を即時に取得し、同期的な処理に適しています。
  • useWatchは特定のフィールドを監視し、値の変化に応じてコンポーネントを再レンダリングします。
  • パフォーマンスや用途に応じて、これらのメソッドを適切に使い分けることが重要です。

React Hook Formを活用することで、フォームの状態管理がよりシンプルかつ効率的になります。watchuseWatchの特性を理解し、フォーム開発に役立ててください。

最後に

React Hook FormのwatchuseWatchは似ているようで、それぞれ異なる特徴と用途があります。フォームの複雑さや要件に応じて、最適な方法を選択することで、より効率的な開発が可能になります。この記事が、皆さんのフォーム開発の参考になれば幸いです。

参考

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?