画面に出ない持ち回りデータを含む配列フォームは行 id で安定化し、並び替え・削除後の保存 payload を回帰テストにする
React
フロントエンド
react-hook-form
知識
運用
配列フォーム(Q&A・実績リストなどの動的な行の追加・削除・並び替え)で、各行が画面に表示されない持ち回りデータ(関連エンティティの id、サーバー由来のメタデータ)を隠し状態として保持している場合、行の識別を配列 index に頼ると、削除・並び替え時に表示中の入力値と隠しデータの対応が行間でずれる。フレームワークが DOM や非制御入力を index キーで再利用するため、見た目は正しいのに保存 payload では隠しデータが別の行に付く、という気づきにくい壊れ方をする。全置換保存と組み合わさると、ずれた紐付けがそのまま永続化される。
判断基準
- 行のキーと操作対象は index ではなく安定 id にする。React Hook Form なら useFieldArray(fields の id を key に、remove / move を使う)が公式の解で、行全体が id ごと移動するため表示値と隠しデータの対応が崩れない。setValue で配列を組み替えて key={index} で描画する自前実装は、この対応を保証しない。
- 表示されないデータほどずれに気づけないため、「隠しデータを持ち回る配列フォームかどうか」をこのパターン適用の判断点にする。表示フィールドだけのフォームならずれても目視で気づける。
検証
目視では検出できないので、操作後の保存 payload をアサートする回帰テストを置く: (1) 並び替えてから保存し、各行の隠しデータ(関連 id 等)が正しい行に随伴していること、(2) 1 行削除してから保存し、残った行の隠しデータがずれていないこと。UI の見た目のテストではなく、送信 payload の中身を検証するのが要点。