Vue で親子コンポーネントの値を双方向バインドするために v-model を使用するときに発生する問題と解決策

Vue で親子コンポーネントの値を双方向バインドするために v-model を使用するときに発生する問題と解決策

シナリオ

今日、コンポーネントの双方向データバインディングにv-modelを使用しているときに奇妙な問題が発生しました。Web ページ自体は正常に実行されましたが、ブラウザに警告メッセージが表示され続けました。

[Vue 警告]: 親コンポーネントが再レンダリングされるたびに値が上書きされるため、プロパティを直接変更することは避けてください。代わりに、プロパティの値に基づいてデータまたは計算プロパティを使用してください。変更されるプロパティ: "value"

この警告はカスタムコンポーネントRxSelectによって発生します

Vue.component("RxSelect", {
 モデル: {
 プロパティ: "値",
 イベント: "変更",
 },
 小道具: {
 値: [数値、文字列],
 地図: 地図、
 },
 テンプレート: `
  <選択
   v-model="値"
   @change="$emit('change', 値)"
  >
   <オプション
   v-for="マップ内の[k,v]"
   :値="k"
   :key="k"
   >{{v}}</オプション>
  </選択>
  `、
});

使用しているコードは問題ないようです。

<メインid="アプリ">
 現在選択されている性別は: {{map.get(sex)}} です
 <div>
 <rx-select :map="マップ" v-model="性別" />
 </div>
</メイン>

JavaScript コード

新しいVue({
 el: "#app",
 データ: {
 マップ: 新しい Map().set(1, "機密").set(2, "男性").set(3, "女性"),
 性別: "",
 },
});

テスト後、プログラム自体は正常に実行され、親コンポーネントと子コンポーネント間の値の転送に問題はなく、双方向のデータバインディングは有効になりますが、ブラウザはエラーを報告し続けます。

解決してみる

方法を見つけた

  1. 双方向バインディングを必要とする変数の場合は、コンポーネントdataで変数innerValue宣言し、それをvalueに初期化します。
  2. この変数innerValueをバインドするには、 selectv-modelを使用します。
  3. valueの変化を監視し、親コンポーネントのvalue変更されたときにinnerValueの値を変更します。
  4. innerValueの変更を監視し、 this.$emit('change', val)を使用して、変更があった場合にvalueを更新する必要があることを親コンポーネントに伝えます。
Vue.component("RxSelect", {
 モデル: {
 プロパティ: "値",
 イベント: "変更",
 },
 小道具: {
 値: [数値、文字列],
 地図: 地図、
 },
 データ() {
 戻る {
  内部値: this.value、
 };
 },
 時計:
 値(val) {
  this.innerValue = val;
 },
 内部値(val) {
  this.$emit("change", val);
 },
 },
 テンプレート: `
 <v-model="innerValue" を選択">
 <オプション
  v-for="マップ内の[k,v]"
  :値="k"
  :key="k"
 >{{v}}</オプション>
 </選択>
 `、
});

使用コードはまったく同じですが、コンポーネントRxSelectのコードははるかに長くなります。 。 。

解決する

よりエレガントな方法は、 computedプロパティとそのget/set使用することですが、追加されるコードの量は許容範囲内です。

Vue.component("RxSelect", {
 モデル: {
 プロパティ: "値",
 イベント: "変更"、
 },
 小道具: {
 値: [数値、文字列],
 地図: 地図、
 },
 計算: {
 内部値: {
  得る() {
  this.value を返します。
  },
  設定(値) {
  this.$emit("change", val);
  },
 },
 },
 テンプレート: `
 <v-model="innerValue" を選択">
 <オプション
  v-for="マップ内の[k,v]"
  :値="k"
  :key="k"
 >{{v}}</オプション>
 </選択>
 `、
});

上記は、Vue が v-model を使用して親コンポーネントと子コンポーネントの値を双方向バインドするときに発生する問題と解決策の詳細です。Vue が v-model を使用して親コンポーネントと子コンポーネントの値を双方向バインドすることの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • v-model 双方向バインディングデータを実装する vue カスタム コンポーネントのサンプル コード
  • vue3 コンポーネントでの v-model の使用と詳細な説明
  • Vue の v-model ディレクティブと .sync 修飾子の違いの詳細な説明
  • Vue の双方向イベントバインディング v-model の原理についての簡単な説明
  • Vueはv-modelを使用してel-paginationコンポーネントのプロセス全体をカプセル化します。
  • Vue における v-model を使用したクロスコンポーネントバインディングの基本的な実装方法
  • Vue フォーム入力ボックスがフォーカスおよびぼかしイベントをサポートしていない問題の解決策
  • カスタムイベントを使用した Vue のフォーム入力コンポーネントの詳細な使用方法 [日付コンポーネントと通貨コンポーネント]
  • Vue フォーム入力バインディングのサンプルコード
  • Vue フォームの入力フォーマットの中国語入力方法の異常
  • Vue フォーム入力バインディング v-model

<<:  MySQLはトリガーを使用してデータベース内のテーブルの行制限を解決します。詳細な説明と例

>>:  Nginx 仮想ホストを構成する 3 つの方法 (ポートベース) の詳細な説明

推薦する

CSS transform-originプロパティを理解する

序文最近、花火アニメーションを作成しました。花火が散るアニメーションです。アニメーションの実装中、花...

トラフィックの多いウェブサイト向けのソリューション

まず、サーバーのハードウェアが現在のトラフィックをサポートするのに十分かどうかを確認します。通常の ...

Win7x64でのMySQL 5.7.18解凍版のインストール方法

関連記事: Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールする...

Vueカスタムテーブル列実装プロセス記録

目次序文レンダリングsetTable コンポーネント使用結論序文フォームを使用して PC 側のプロジ...

開発をスピードアップできる VueUse ライブラリ 5 つ (まとめ)

目次VueUse にはどのようなユーティリティがありますか? VueUseをVueプロジェクトにイン...

MySQLクエリの文字セットの不一致の問題を解決する方法

問題を見つける最近、仕事で問題が発生しました。MySQL データベースにテーブルを作成するときに、ラ...

Windows での MySQL コミュニティ サーバー 8.0.16 のインストールと構成方法のグラフィック チュートリアル

最近、MySQL関連の構文をよく見かけます。また、MySQLストアドプロシージャの書き方も学びたいの...

MySQLのexplain型の詳細な説明

導入:多くの場合、さまざまな選択ステートメントを使用して必要なデータを照会した後、多くの人は作業が正...

ブラウザのキャッシュを防ぐために、js または css の後に ?v= バージョン番号を追加します。

コードをコピーコードは次のとおりです。 <span style="font-size...

Dockerボリュームマウントの実装方法

最も単純な hello world 出力イメージを作成することは最も簡単なスタートですが、実行中のコ...

nginx keepaliveの具体的な使い方

http1.1 プロトコルのデフォルトのリクエスト ヘッダーでは、図に示すように、デフォルトで ke...

Vue で eslint 検出をオフにする方法 (複数の方法)

目次1. 問題の説明2. 問題解決1. 問題の説明Vue プロジェクトを開発する場合、作成時に誤って...

MySQL 8.0.12 簡単インストールチュートリアル

この記事では、MySQL 8.0.12のインストールチュートリアルを参考までに紹介します。具体的な内...

mysql-5.7.21-winx64 無料インストール版のインストール - Windows チュートリアル詳細説明

1 ダウンロードアドレスは https://dev.mysql.com/downloads/mysq...

大きなオフセットによる MySQL 制限ページングが遅い理由と最適化ソリューション

MySQL では通常、limit を使用してページ上のページング機能を完了しますが、データ量が大きな...