Vueカスタムコンポーネントは双方向バインディングを実装します

Vueカスタムコンポーネントは双方向バインディングを実装します

シナリオ:

一般的に使用される親コンポーネントと子コンポーネント間の相互作用方法は次のとおりです。
親コンポーネントは、props を通じて子コンポーネントにデータを流します。
子コンポーネントは、更新された配列を $emit 経由で親コンポーネントに送信します。

今日は、入力ボックスの v-model を参照して、カスタム コンポーネントの双方向データ バインディングを実装し、別の方法でインタラクションを実装します。
つまり、親コンポーネントの値が変化すると、子コンポーネントの値もそれに応じて変化し、逆に子コンポーネントの値が変化すると、親コンポーネントの値もそれに応じて変化します。

サブコンポーネントの定義:

props 属性値を直接変更することはできないため、ここで valueData を定義し、listen によってリアルタイムで値を受け取り、click メソッドを通じて valueData を変更します。
モデル構文の sugar prop は受信した props 属性値であり、一貫性を保つ必要があることに注意してください。 event は、先ほど渡されたイベントの名前です。

コードは次のとおりです。

<テンプレート>
  <div>
    <div>{{ `サブコンポーネントの値: ${value}` }}</div>
    <div @click="click">値を変更するにはここをクリック</div>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: ""、
  モデル: {
    プロパティ: "値",
    イベント: 「変更」
  },
  小道具: {
    値: 数値
  },
  コンポーネント: {},
  データ() {
    戻る {
      値データ: ""
    };
  },
  時計:
    値(新しい値、古い値) {
      this.valueData = 新しい値;
      console.log(`サブコンポーネントの値: ${newValue}`);
    }
  },
  作成された() {
  },
  マウント() {
  },
  メソッド: {
    クリック() {
      this.valueData++;
      this.$emit("change", this.valueData);
    }
  }
};
</スクリプト>
<style lang='less' スコープ>
</スタイル>

親コンポーネントの定義:

親コンポーネントは、v-model を通じてテキスト値をバインドします。名前は必ずしも値である必要はなく、命名規則に準拠する他の文字列にすることができます。ここではテキストです。
子コンポーネントが変更イベントを通じてデータを更新すると、それに応じて v-mode バインディング値が変更されます。
または、親コンポーネントがテキスト値を変更すると、子コンポーネントの値もそれに応じて変更されます。

コードは次のとおりです。

<テンプレート>
  <div>
    <div>{{ `親コンポーネントの値: ${text}` }}</div>
    <div @click="click">値を変更するにはここをクリック</div>


    <span>---------------------------------------------------------</span>

    <テストの子供 v-model="テキスト"></テストの子供>

  </div>
</テンプレート>

<スクリプト>
「@/views/TestChildren」からTestChildrenをインポートします。

エクスポートデフォルト{
  名前: ""、
  コンポーネント: { TestChildren },
  データ() {
    戻る {
      テキスト 1
    };
  },
  作成された() {
  },
  マウント() {
  },
  時計:
    テキスト(新しい値、古い値) {
      console.log(`親コンポーネントの値: ${newValue}`);
    }
  },
  メソッド: {
    クリック() {
      this.text--;

    }
  }
};
</スクリプト>
<style lang='less' スコープ>
</スタイル>

結果:

テストのためにコードを自分のプロジェクトに直接コピーします。値が親コンポーネントによって変更されるか、子コンポーネントによって変更されるか。 v-mode によってバインドされた 2 つのコンポーネントの値は常に一貫しています。

質疑応答:

クラスメートが尋ねました。これは、props を通じてデータを下向きに流し、次に $emit を通じてデータを上向きに渡すのと同じではないですか? 私のように双方向バインディングの効果も実現できます。 実際、v-model を使用しない場合、親コンポーネントに次のコードを記述することになります。

<テストの子供 @change="changeText"></テストの子供>

次に、changeText メソッドを定義してテキスト値を変更します。

ページがより複雑になり、参照されるコンポーネントの数が多くなると、ページ内にこのようなメソッドを 10 個または 20 個以上定義する必要があると想像してください。読み取り可能な行数が大幅に減少し、メンテナンスコストが増加します。

拡張機能:

vue2.3以降では、双方向バインディングも実現できるsyncメソッドが提供されています。

親コンポーネントでの記述:

<テストの子:value.sync="テキスト"></テストの子>

次のモデル定義はサブコンポーネントでは必要ないので、削除してください。

モデル: {
プロパティ: "値",
イベント: 「変更」
},

親コンポーネントにデータを渡すには、次のメソッドを使用します。

this.$emit("update:value", this.valueData);

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue2はコンポーネントプロパティの双方向バインディングを実装します
  • vue.js双方向バインディングの実装原理の深い理解
  • Vue2.0はv-modelを使用して、コンポーネントプロパティの双方向バインディングの美しいソリューションを実装します。
  • Vue で双方向バインディングを実装する 4 つの方法
  • Vuejs 入門チュートリアル第1弾の詳しい解説(一方向バインディング、双方向バインディング、リストレンダリング、レスポンス機能)
  • Vue で親コンポーネントと子コンポーネント間の双方向バインディング値転送を実装する方法
  • Vue.js はデータの双方向バインディングを毎日学習する必要があります
  • AngularとVue間の双方向データバインディングの実装原理(Vueの双方向バインディングに重点を置く)
  • Vueで双方向バインディングを実装する方法
  • Vue カスタム コンポーネント v-model 双方向バインディング、親子コンポーネントの同期通信を記述する複数の方法

<<:  Elimination の JavaScript ソースコード

>>:  Vue で v-if と v-for を一緒に使用することが推奨されない理由の詳細な説明

推薦する

MySQL で union all を使用してユニオンソートを取得する方法

プロジェクトでは、何らかの不可逆的な理由により、テーブルに保存されたデータがページの表示要件を満たす...

Windows に MySQL 8.0.16 をインストールする手順とエラーの解決方法

1. はじめに: mysql8以降は、これまでよく使われていたバージョンと比べてかなり変更点が大きい...

Vue-Routerのインストールプロセスと原理の詳細

目次1. フロントエンドルーティングの実装原則2. vue-Routerの基本的な使い方2.1. イ...

JavaScript の手ぶれ補正とスロットリングの詳細な説明

目次デバウンススロットル要約するデバウンス定義: スクロール イベントなど、短時間に連続してトリガー...

docker を使用して Django テクノロジー スタック プロジェクトをデプロイする方法

Docker の人気と成熟に伴い、Docker は徐々にプロジェクトをデプロイするための第一の選択肢...

Ubuntuがネットワークに接続できない場合の解決策

仮想マシン内の Ubuntu がネットワークに接続できない場合の効果的な解決策: 1. Ubuntu...

Dockerでmongodbデータベースを使用するための実装コード

mongoイメージを取得する sudo docker pull mongo mongodbサービスを...

MySQLクエリツリー構造方式

目次MySQL クエリツリー構造1. ツリー構造について2. MySQLでカスタム関数を定義する方法...

変数が空かどうかを判定するシェルの方法の概要

シェルで変数が空かどうかを判断する方法シェルプログラミングでは、パラメータのエラーチェック項目に、変...

MySQL サーバー 5.7.20 のインストールと設定方法のグラフィック チュートリアル

この記事ではMySQL 5.7.20のインストールと設定方法を記録し、皆さんと共有します1. MyS...

バランスの取れたデジタルスクロール効果を実現するJavaScript

目次1. 実施の背景2. 実装のアイデア3. 実施プロセス1. 実施の背景先週、ユーザーがタスクを完...

MySQL の NULL と空の文字列

最近、MySQL に触れました。昨日、テーブル構造情報を格納するための新しいテーブルを作成しました。...

CSS3 背景コントロールプロパティと色遷移を使用してグラデーション効果を実現します。

CSS3 背景画像関連互換性: IE9+背景クリップ 背景画像描画領域background-cli...

mysql 8.0.18 mgr のインストールと切り替え機能

1. システムインストールパッケージ yum -y インストール make gcc-c++ cmak...

MySQL 5.7.17 でパスワードを忘れた場合の対処方法

1. my.iniファイルにskip-grant-tablesを追加し、MySQLサーバーを再起動し...