React useImperativeHandle — カスタムコンポーネントAPIの公開

useImperativeHandleを使って、refを通じて子コンポーネントからカスタムAPIを親に公開する方法を学びます。forwardRef、ビデオプレーヤー、フォームバリデーション、モーダル制御を網羅。

Ref Hooks

詳細な説明

useImperativeHandleによるカスタムコンポーネントAPI

useImperativeHandleは、コンポーネントでrefを使用するときに親が見るものをカスタマイズできます。DOM全体を公開する代わりに、公開したいメソッドのみを公開します。

パターン

const Modal = forwardRef<ModalHandle, { children: React.ReactNode }>(
  function Modal({ children }, ref) {
    const dialogRef = useRef<HTMLDialogElement>(null);

    useImperativeHandle(ref, () => ({
      open() { dialogRef.current?.showModal(); },
      close() { dialogRef.current?.close(); },
    }));

    return <dialog ref={dialogRef}>{children}</dialog>;
  }
);

使用するタイミング

  • 再利用可能なUIライブラリコンポーネント(モーダル、ドロワー、ビデオプレーヤー)の構築
  • サードパーティの命令的APIをラップするコンポーネント
  • 宣言的パターンでは不十分な場合にのみ使用

ほとんどの通信はpropsとstateを通じて行うべきです。命令的ハンドルは宣言的パターンでは不十分な場合のエスケープハッチです。

ユースケース

モーダル、ビデオプレーヤー、フォームバリデーター、リッチテキストエディターなど、特定の命令的メソッドを親コンポーネントに公開する必要のある再利用可能なライブラリコンポーネントにuseImperativeHandleを使用します。

試してみる — React Hooks Reference

フルツールを開く