🏠 ホーム
フロントエンド
PHP
Go言語
プログラミングの理解
プログラマーへの道
Google API

React でのバリデーション: onChange と 投稿ボタン時 のデータ構造の違い

  プログラミング >     フロントエンド >  

React でフォームバリデーションを実装する際に、onChange のタイミングと 投稿ボタン を押したときでデータ構造が異なる ことがあります。
特に、ネストされたデータを管理 する場合、配列形式と文字列形式が使い分けられることが多い です。

Redux、または Formik/Yup などのフォーム管理ライブラリ でも見られる仕組みです。


🎯 onChange のデータ構造

📌 ユースケース

例えば、ブログ記事の管理画面を作成するとします。
記事には タイトル、本文、カテゴリ などのフィールドがあり、カテゴリごとにタグを設定できます。

{
  "blogPosts": {
    "0": {
      "category": {
        "tags": "React,JavaScript"
      }
    }
  }
}

このような構造のデータを管理するとします。

🛠 onChange の場合

フォームの 各フィールドの値が変更 されると、それに対応するデータが更新されます。
この時、データのパスは 配列形式 で管理されることが多いです。

['blogPosts', '0', 'category', 'tags']

この 配列形式のパス を使うことで、ネストされたデータの特定の部分を簡単に取得・更新できます。

onChange のメリット


🎯 投稿ボタンを押したときのデータ構造

📌 文字列形式のパス

一方、投稿ボタンを押して データをサーバーに送信 するときには、データのキーが 文字列形式 になることが一般的です。

{
  "blogPosts.0.category.tags": "React,JavaScript"
}

このように、ネストされたデータの キーを "blogPosts.0.category.tags" のような文字列で表現 することで、
サーバー側でデータを簡単にパースして処理できます。

🛠 投稿ボタン時 のメリット


🎯 onChange投稿ボタン時 のデータ構造の違い

タイミング データ形式
onChange 配列(パス表現) ['blogPosts', '0', 'category', 'tags']
投稿ボタン時 文字列(ドット表記) "blogPosts.0.category.tags"

💡 両方の形式に対応する方法

フォームバリデーションやデータ処理を行う際には、どちらの形式にも対応できるようにする ことが重要です。

例えば、バリデーション関数で 配列形式と文字列形式の両方を処理 するようにすると、
どのタイミングでも正しく動作するようになります。

isInvalid(key, value) {
  let keyParts;

  // keyが配列(onChange時)
  if (Array.isArray(key)) {
    keyParts = key;
  } 
  // keyが文字列(投稿ボタン時)
  else if (typeof key === 'string') {
    keyParts = key.split('.'); // ドットで区切って配列に変換
  } 
  else {
    return false;
  }

  // 最後の要素が 'tags' ならバリデーション対象
  if (keyParts[keyParts.length - 1] === 'tags') {
    return !this.isValidTags(value);
  }

  return false;
}

Array.isArray(key)onChange のときの配列を処理。
typeof key === 'string' のときは .split('.') で配列に変換。
これで onChange でも 投稿ボタン時 でも正しく動作!


🎯 まとめ

React では onChange の時は ['blogPosts', '0', 'category', 'tags'] のような配列を使うことが多い(ネストされたデータの更新が簡単)。
API にデータを送るときには "blogPosts.0.category.tags" のようなドット表記のキーを使うことが一般的。
両方に対応するには Array.isArray(key) で判定し、文字列なら .split('.') で配列に変換すると便利! 🚀

この仕組みを理解しておくと、フォームの管理がスムーズ になり、柔軟なバリデーションを実装 できるようになります! 💡

登録日:

更新日:

by

コメント         tweetでコメント