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で配列を管理する際の注意点と解決策

Posted at

はじめに

この記事では、React Hook Formを用いて配列データを管理する際に直面した問題と、その解決方法について詳しく解説します。

特に、useFieldArrayを利用する際に発生する型定義の問題に焦点を当て、なぜプリミティブな配列ではなくオブジェクトの配列を使用する必要があるのかを説明します。

プリミティブ配列で発生する問題

React Hook Formはフォーム管理を効率化するライブラリですが、useFieldArrayでプリミティブな配列(例えばstring[])を扱おうとすると、以下のようなTypeScriptエラーが発生します。

// ❌ これは動作しません
const { control } = useForm<{ items: string[] }>();
const { fields, append } = useFieldArray({
  control,
  name: "items"
});

このコードでは「型 'string' を型 'never' に割り当てることはできません」というエラーが発生します。これは、useFieldArrayが内部でオブジェクト型のデータ構造を前提としているためです。

オブジェクトの配列を利用する解決策

上記の問題を回避するためには、各要素をオブジェクトとして管理する必要があります。例えば、以下のように配列の各要素を{ title: string }という形式にすることで、正しく動作します。

// ✅ これは動作します
const { control } = useForm<{ items: { title: string }[] }>();
const { fields, append } = useFieldArray({
  control,
  name: "items"
});

この方法により、React Hook Form内部で期待されるデータ構造と一致し、TypeScriptエラーを回避できます。

React Hook Formの型定義からの学び

実際にReact Hook Formのソースコードや公式サンプルコードを確認すると、useFieldArrayはオブジェクトの配列を前提として設計されていることがわかります。例えば、公式のサンプルでは以下のような型定義が使用されています。

type FormValues = { data: { name: string }[] };

この定義から、配列の各要素は必ずオブジェクト(ここでは{ name: string })であることが明示されており、正しい型定義を行うための参考になります。

まとめ

React Hook FormのuseFieldArrayを利用する際の重要なポイントは以下の通りです。

  1. オブジェクトの配列を使用する

    • ❌ プリミティブな配列(例: string[])は使用しない
    • ✅ オブジェクトの配列(例: { name: string }[]{ title: string }[])を使用する
  2. 公式ソースコードやサンプルを参照する

    • 公式の型定義やサンプルコードを確認することで、正しい使い方を理解できます

以上のポイントを押さえることで、React Hook Formを用いた配列管理がスムーズに行えるようになります。

参考リンク

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?