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

推薦する

bitronix を使用して MySQL に接続するときの MySQLSyntaxErrorException の解決方法

bitronix を使用して MySQL に接続するときの MySQLSyntaxErrorExce...

HTMLページ間で値を渡す問題の解決策

初めてこのエッセイを使ったとき、私はかなりぎこちなく感じましたhtmlファイルコードをコピーコードは...

Linuxシステムはルートアカウントのリモートログインコマンドを禁止しています

ps: Linux システムで root アカウントのリモート ログインを無効にする方法は次のとおり...

JavaScript ドキュメント オブジェクト モデル DOM

目次1. JavaScriptはページ内のすべてのHTML要素を変更できる1. IDでHTML要素を...

docker と docker-compose による eureka の高可用性の実現の詳細な説明

最近、新しいプロジェクトでは springcloud と docker が使用されています。この 2...

Nginx で Basic Auth ログイン認証を設定する方法

nginx でファイルサーバーを構築することもありますが、これは一般に公開されていますが、サーバーが...

MySQL json 形式のデータクエリ操作

デフォルトのテーブル名はbase_dataで、json列名はjson_valueです。 json_v...

Dockerはプロセス操作を管理するためにSupervisorを使用する

Docker コンテナは、起動時に、たとえば ssh または apache デーモン サービスなどの...

Vue ルーティングフォールバックに最適なソリューション (vue-route-manager)

目次ルーティングマネージャー背景はじめる問題を解決する方法要約するルーティングマネージャー各ジャンプ...

CenOS6.7 mysql 8.0.22 のインストールと設定方法のグラフィックチュートリアル

CenOS6.7 は MySQL8.0.22 (推奨コレクション) をインストールします1. MyS...

ウェブサイトはいつ広告を掲載すべきでしょうか?

最近、インターネットのベテランと「広告」について議論したのですが、彼から非常に興味深い意見を聞きまし...

Linux でのマルチスレッドプログラミング例の分析

1 はじめにスレッド技術は 1960 年代にすでに提案されていましたが、マルチスレッドがオペレーティ...

React Nativeのカスタムルーティング管理に関する深い理解

目次1. カスタムルーティング2. タブナビゲーション3. データの返却要約する1. カスタムルーテ...

mysql は sql ファイルを実行し、エラーを報告します エラー: 不明なストレージ エンジン 'InnoDB' ソリューション

問題を見つける最近、仕事で問題が発生しました。InnoDB タイプの SQL ファイルを実行すると、...