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 つの方法 (ポートベース) の詳細な説明

推薦する

MySQL 5.7 クラスタ構成手順

目次1. サーバーAのmy.cnfファイルを変更する2. サーバーBのmy.cnfファイルを変更する...

タブ切り替え効果を実現するJavaScript

この記事では、タブ切り替え効果を実現するためのJavaScriptの具体的なコードを参考までに紹介し...

ES6 の Set および WeakSet コレクションの詳細な説明

目次セットは値が重複しない特別なコレクションです。セットコレクション基本API独自の価値判断セットを...

Dockerを使用してMQTTサーバーを構築するプロセスの詳細な説明

1. イメージをプルするdocker pull registry.cn-hangzhou.aliyu...

HTML で相対パスを使用してディレクトリのすべてのレベルのファイルを取得する方法の詳細な説明

相対パスの概念現在のファイルの場所を参照ポイントとして使用して、ターゲット ファイルへのパスを確立し...

Vue はファジークエリを実装します - MySQL データベースデータ

目次1. 需要2. 実装3. 結果1. 需要入力ボックスにデータを入力し、入力結果に基づいてデータベ...

JSにおける4つのデータ型判定方法

目次1. 型2. インスタンス3. コンストラクター4.toString() この記事では、4 つの...

Docker を使用した ElasticSearch:7.8.0 クラスターのインストールに関する詳細なチュートリアル

ElasticSearch クラスターは、クラスターを構築するための動態請求的方式と靜態配置文件をサ...

VUEはG2チャートを使用した実装を導入します

目次G2チャートについて使用テンプレートで使用される完全なコード (棒グラフ)世界地図を追加するG2...

Dockerコンテナは定期的にデータベースをバックアップし、指定されたメールボックスに送信します(設計アイデア)

目次1. 背景: 2. デザインのアイデア: 3. 起動スクリプトを書く4. イメージを構築する5....

入力タイプ=ファイルスタイルを定義する方法

ファイルコントロールを美しくする理由は何ですか?他の子供たちはみんなきちんとしたきれいな服を着ている...

jQueryフレームワークは、要素の表示と非表示の3つのアニメーションメソッドを実装しています。

目次1. デフォルトで表示と非表示を切り替える2. スライドして表示と非表示を切り替える3. フェー...

W3C標準に準拠したHTML標準で注意すべき点を詳細に解説

XML/HTML コードコンテンツをクリップボードにコピー<!DOCTYPE html PUB...

mysql.data.dll ドライバーのさまざまなバージョンの簡単な分析

ここにmysqlドライバmysql.data.dllがあります知らせ:ここではX86バージョンが多く...

CSS3実践手法のまとめ(推奨)

1. 丸い境界線: CSSコードコンテンツをクリップボードにコピー境界線の半径: 4px ; 2....