【Vue.js】propsは子コンポーネント内で直接変更しない(バケツリレー想定時)

以下、作業用メモです。

実務のなかで、知らずにやってしまっていたことなので、メモ_φ(・_・

親コンポーネントから子コンポーネントに渡されたpropは直接変更されるべきではない

【理由】

propsは親コンポーネントから子コンポーネントに渡されるデータであり、親コンポーネントが管理するもの。

propsを子コンポーネントで直接変更すると、データフローが予測不能になり、アプリケーションのメンテナンスやデバッグが困難になる。

また、propsの変更は一方向のデータバイディングの原則に違反する可能性がある。

子コンポーネントでpropsの値を変更する必要がある場合には

プロジェクトによって以下の方法を検討する。

  1. ローカルなデータの使用:子コンポーネント内でローカルなデータを定義し、それを変更する。この場合には、親コンポーネントから渡されたpropsを初期値として使用することができるが、その後はローカルなデータとして扱う。
  2. イベントを発火して通知する:子コンポーネントが変更されたことを親コンポーネントに通知するために、カスタムイベントを発火する。親コンポーネントでは、このイベントをキャッチして、必要な処理を実行する。
  3. Vuexなどの状態管理ライブラリの使用:大規模なアプリケーションでは、Vuexなどの状態管理ライブラリを使用して、アプリケーション全体の状態を一元管理している。この場合、子コンポーネントは状態を直接変更するのではなく、ストア内のデータを変更する。

上記、対応したことがあるのは2のみ。

1と3の方法も一度試してみたいです。

v-modelをv-bindとv-onの組み合わせに変更

実際の変更点として、v-modelを使用して、直接propsの中身を変更してしまっていたので、ここをv-bindでpropsのデータを渡し(子コンポーネントに)、v-onで子コンポーネントのイベントを検知して(入力操作や変更状態など)親コンポーネントにデータを渡すように変更しました。

この記事を書いた人