Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Controller, useControlller(), and register() in react-hook-form

2025年09月07日に「Dev.to」が公開したITニュース「Controller, useControlller(), and register() in react-hook-form」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

React Hook Formで、フォームの状態管理には`register()`、`<Controller />`、`useController()`がある。`register()`はDOMで状態管理し、非制御コンポーネントとして扱う。`<Controller />`と`useController()`はReactで状態管理し、制御コンポーネントとして扱う。Sliderやテーマ切替のように、グローバルな状態管理が必要な場合は、Controllerを使うのが推奨される。useController()はJSXの記述を簡潔にする。

ITニュース解説

この記事は、React Hook Formライブラリにおけるregister()<Controller />useController()の3つのAPIの違いと使い分けについて解説している。システムエンジニアを目指す初心者に向けて、これらの概念を分かりやすく説明する。

まず、Reactにおける「制御されたコンポーネント」と「制御されていないコンポーネント」という基本的な考え方を理解する必要がある。制御されたコンポーネントでは、Reactがコンポーネントの状態を管理し、イベントが発生するたびに状態を更新する。一方、制御されていないコンポーネントでは、DOM(Document Object Model)が状態を管理し、refを使って状態にアクセスする必要がある。

register()は、React Hook Formで最も基本的なAPIであり、input要素などのフォーム要素を登録するために使用する。register()を使用すると、フォーム要素の状態はDOMによって管理されるため、コンポーネントは制御されていないコンポーネントとして扱われる。register()は、HTMLのネイティブな要素(input、select、textareaなど)を扱う場合に適している。これらの要素は、ブラウザがデフォルトで状態管理の機能を持っているため、Reactで状態を管理する必要がない。

<Controller />は、React Hook Formが提供するコンポーネントであり、コンポーネントの状態をReactで管理する場合に使用する。<Controller />を使用すると、コンポーネントは制御されたコンポーネントとして扱われる。<Controller />は、Slider、Rating、Color Pickerなど、HTMLのネイティブな要素では表現できないUIを構築する場合に特に役立つ。これらのUIでは、状態の管理や値の変換をReactで行う必要があるため、<Controller />が適している。<Controller />を使用するには、controlプロパティにuseFormContext()から取得したcontrolオブジェクトを渡す必要がある。また、renderプロパティに関数を渡し、コンポーネントのレンダリング方法を定義する必要がある。render関数は、fieldオブジェクトを受け取り、field.valueで現在の値にアクセスし、field.onChangeで値を更新できる。

useController()は、<Controller />と同様に、コンポーネントの状態をReactで管理する場合に使用するHookである。<Controller />コンポーネントを使用する代わりに、カスタムのコンポーネント内でuseController()Hookを使用できる。useController()を使用すると、<Controller />コンポーネントを使用する場合よりもコードが簡潔になる場合がある。useController()は、nameプロパティとcontrolプロパティを受け取る。nameプロパティは、フォーム内で一意なフィールド名を指定する。controlプロパティは、useFormContext()から取得したcontrolオブジェクトを渡す。useController()は、fieldオブジェクトを返す。fieldオブジェクトには、value(現在の値)とonChange(値を更新するための関数)が含まれている。

register()<Controller />/useController()の使い分けは、コンポーネントの状態をどこで管理するかによって決まる。HTMLのネイティブな要素を扱う場合はregister()を使用し、カスタムのUIを構築する場合は<Controller />またはuseController()を使用する。

さらに、状態をグローバルに管理する必要がある場合は、<Controller />またはuseController()を使用する方が良い。例えば、テーマ(ダークモード/ライトモード)の状態は、アプリケーション全体のUIに影響を与えるため、グローバルに管理する必要がある。このような場合、useContextなどのReactのコンテキストAPIと組み合わせて、<Controller />またはuseController()を使用することで、状態を効率的に共有できる。

<Controller />useController()のどちらを使用するかは、コードの可読性や保守性に影響する。<Controller />を使用すると、JSXが冗長になる場合がある。一方、useController()を使用すると、コードが簡潔になる場合がある。ただし、同じコンポーネント内に多数のフィールドがある場合は、複数のuseController()を使用するとコードが読みにくくなる可能性がある。このような場合は、<Controller />を使用する方が良い場合もある。また、コンポーネントを複数の小さなコンポーネントに分割できる場合は、useController()を使用する方がコードが簡潔になる可能性がある。

まとめると、React Hook Formのregister()<Controller />useController()は、それぞれ異なるユースケースに対応したAPIである。HTMLのネイティブな要素を扱う場合はregister()を使用し、カスタムのUIを構築する場合は<Controller />またはuseController()を使用する。状態をグローバルに管理する必要がある場合は、<Controller />またはuseController()を使用する方が良い。<Controller />useController()のどちらを使用するかは、コードの可読性や保守性を考慮して決定する必要がある。

関連コンテンツ