フロントエンドフレームワーク Vue における親子コンポーネントデータの双方向バインディングの実装

フロントエンドフレームワーク Vue における親子コンポーネントデータの双方向バインディングの実装

実装のアイデア:

親コンポーネントから子コンポーネントに値を渡すには、 props属性を使用します。 ( props propertyの複数形の略語です )
子コンポーネントから親コンポーネントに値を渡すには、カスタム イベントを使用します。

1. 親コンポーネントと子コンポーネント間の一方向の値転送

1. 親から子への値の受け渡し

親は子コンポーネントに値を渡し、子コンポーネントはデータを受け取った後、それを独自の変数に保存します。

//親コンポーネントの書き込み方法 <cld :numP="num" ></cld> 
 
//サブコンポーネントの定義とデータコンポーネント:{ 
 終了:{ 
  テンプレート:'#child', 
  小道具:{ 
   numP:数値 
  }, 
 } 
} 
 
//サブコンポーネントコンテンツ <template id="child"> 
 <div> 
  {{ numP }} 
 </div> 
</テンプレート> 


Props は、親コンポーネントから渡された値を受け取るために使用されます。props の記述方法は、次のように多数あります。

//方法 1: データを直接受信する props: ['numP'] 
 
//方法2: 型制限プロパティを追加する: [ 
 numP: 数値 
 ]  
 
//方法3: デフォルト値のプロパティを追加する: [ 
 数値P: { 
  タイプ:数値、 
  デフォルト:0 
  } 
]  
 
//方法4: propsの値を制限する必要があるか: [ 
 数値P: { 
  タイプ:数値、 
  デフォルト:0、 
  require:true // 必要な値を追加します。追加しない場合はエラーが報告されます} 
]  
 
//方法5: オブジェクトフォームプロパティの使用: { 
 数値P: { 
  タイプ:数値、 
  デフォルト:0、 
 } 
} 

2. 子から父への価値の継承

子は主にカスタムイベントを通じて親コンポーネントに値を渡します。具体的な例は以下のとおりです。

// 親コンポーネントのコンテンツ <div> 
 子コンポーネントによって取得されるデータは {{getNum}} です 
 <cld :numb="num" @accept="getNumC"></cld> 
</div> 
 
//親コンポーネントメソッド メソッド:{ 
 getNumC(データ){ 
  this.getNum = data //子コンポーネントからデータを受け取る} 
}, 
//サブコンポーネント定義コンポーネント:{ 
 終了:{ 
  テンプレート:'#child', 
  データ(){ 
   戻る { 
    numC:1314 //サブコンポーネントデータ定義} 
  }, 
  マウントされた(){ 
    this.$emit('accept', this.numC) // カスタムイベントをトリガーする} 
  } 
}, 

2. 親子コンポーネントデータの双方向バインディング

Vueのデータは一方向に流れ、 vueには双方向バインディングは存在しません。 v-modelによって実装された双方向バインディングは単なる構文上の糖衣です。

方法 1: watchを使用して、親コンポーネントと子コンポーネント間の双方向データ バインディングを実装します。具体的な例は次のとおりです。

<div id="アプリ"> 
 データ<br>{{num}} 
 <input type="text" v-model="num"><br> 
 <cld :numb="num" @accept="getNumC"></cld> 
</div> 
//サブコンポーネントコンテンツ <template id="child"> 
 <div> 
  データ<br>{{childNum}} 
  <input type="text" v-model="childNum" /> 
 </div> 
</テンプレート> 
 
  <!-- 親子コンポーネントの通信 --> 
constアプリ = 新しいVue({ 
 el:'#app', 
  データ:{ 
   番号:'520', 
   }, 
  方法:{ 
   getNumC(データ){ 
    this.num = データ 
   } 
  }, 
  コンポーネント:{ 
   終了:{ 
    テンプレート:'#child', 
    小道具:{ 
     数値:文字列 
    }, 
   データ(){ 
    戻る { 
     子番号:0, 
    } 
   }, 
  時計:{ 
   数値:関数(){ 
    this.childNum = this.numb 
   }, 
   子番号:関数(){ 
    this.$emit('accept',this.childNum) 
    } 
   }, 
  マウントされた(){ 
   this.childNum = this.numb 
   } 
  } 
 }  
}) 


方法2:双方向バインディングを実現するためのsync修飾子

vue 1.x の .sync 修飾子によって提供される機能。子コンポーネントが .sync を使用してプロパティの値を変更すると、その変更は親コンポーネントにバインドされた値にも同期されます。これは便利ですが、一方向のデータフローが中断されるため、問題が発生する可能性もあります。 (データは上から下へ流れ、イベントは下から上へ流れます)

<cld :numb.sync="num" ></cld> 
// は次のように展開されます: 
<cld :numb="bar" @update:numb="val => bar = val"/> 


コンポーネントが numb の値を更新する必要がある場合は、更新イベントをトリガーする必要があります。

this.$emit("update:numb", newValue ); 


具体的な使用例は以下の通りです。

// 親コンポーネント <Father :foo.sync="foo"></Father> 
 
//子コンポーネントのプロパティ: ['foo'], 
データ() { 
  戻る { 
   新しいFoo: this.foo; 
   } 
}, 
方法:{ 
 追加:関数(){ 
  this.newMsg=10; 
  this.$emit('update:foo',this.newFoo); 
 } 
} 

フロントエンドフレームワーク Vue における親子コンポーネントデータの双方向バインディングに関するこの記事はこれで終わりです。Vue における親子コンポーネントデータの双方向バインディングに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • v-model 双方向バインディングデータを実装する vue カスタム コンポーネントのサンプル コード
  • Vue2.x における双方向バインディングの原理と実装
  • Vue の双方向イベントバインディング v-model の原理についての簡単な説明
  • Vue2.0でデータの双方向バインディング機能をjsを使って実装する
  • 純粋な JS を使用して vue.js で双方向バインディング機能を実装する方法
  • Vue双方向バインディングの詳細な説明

<<:  MySQL の詳細な単一テーブルの追加、削除、変更、クエリの CRUD ステートメント

>>:  Docker が elasticsearch を起動するときのメモリ不足の問題と解決策

推薦する

vue2 vue3 での Echarts の詳細な使用方法

目次1. インストール2. vue2でEchartsを使用するmain.jsファイル内コンテナが与え...

CSS で雨滴アニメーション効果を実装するサンプルコード

ガラス窓今日実現するのは雨滴効果です。ただし、雨滴効果を実現する前に、まずは曇りガラス効果を作成しま...

MySQL における単一テーブルと複数テーブル、およびビューと一時テーブルに対する Update と Select の違い

1. テーブルAのデータを使用してMySQLのテーブルBの内容を更新するたとえば、データ テーブル内...

要素の読み込み効果を実現するための純粋なHTML+CSS

これは Element UI の読み込みコンポーネントのエフェクトです。かっこいいですね。実装してみ...

ポートマッピング後に Docker コンテナが突然接続に失敗する問題のトラブルシューティング プロセス

1. 背景通常、外部サービスを提供する必要がある Docker コンテナの場合、起動時に -p コマ...

TortoiseSvn Little Turtle インストール 最新の詳細なグラフィックチュートリアル

tortoiseGit のインストール時にいつも問題があったので、単純に svn に変更しました。途...

DockerでRedisを使用するための詳細な手順

1. はじめにこの記事では、Docker を使用して Redis を探索する方法を説明します。 Do...

Linux 上の LAN 内のすべてのホスト名 (コンピュータ名) をすばやく一覧表示するスクリプト

最近、LAN 内のすべてのホスト名を一覧表示する必要があります (SMB プロトコル)。しかし、fi...

DockerにJava環境をインストールするための実装手順

この記事は Linux centos8 をベースにして、docker をインストールし、イメージをプ...

Docker mongoDB 4.2.1 をインストールし、Springboot ログを収集する詳細な手順

1: dockerにmongodbをインストールするステップ1: dockerにmongodbをイン...

vue.js ベースの QQ チャット ルーム

目次導入効果のデモンストレーションは次のとおりです。 MChat コンポーネントのレンダリング: I...

MySQL で浮動小数点データを文字データに変換するときに起こりうる問題の詳細な説明

序文この記事は主に、MySQL で浮動小数点型を文字型に変換するときに発生する問題を紹介します。これ...

Nginx を使用して IP アドレスが悪意を持って解決されるのを防ぐ方法

Nginxを使用する目的Alibaba Cloud ECS クラウド サーバーを使用して、まずは著者...

ウェブサイトのユーザーエクスペリエンスデザイン(UE)

Google Reader で、JunChen が書いた「フロー理論と設計」というタイトルの投稿を見...

VMware esxi6.5 のインストールと使用の詳細な手順

目次導入建築ESXIの利点vSphere とは何ですか? 2. 仮想マシンの利点3. 仮想マシンを使...