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 5.7 zip アーカイブ バージョンのインストール チュートリアル

この記事では、MySQL 5.7 zipアーカイブ版のインストールチュートリアルを参考までに紹介しま...

MySQL で誤って削除したテーブル データを回復する方法 (必読)

バックアップがあれば、非常に簡単です。最新のバックアップ データを生成し、mysqlbinlog を...

MySQL 5.7.27 のダウンロード、インストール、設定に関する詳細なチュートリアル

目次1. ダウンロード手順2. 環境変数を設定する3. my.iniファイルを設定する4. MySQ...

MySql 認証に基づく vsftpd 仮想ユーザー

目次1. MySQLのインストール1.2 テーブル、データベース、ユーザーを作成する1.3 リモート...

MySQL の従来のソート、カスタム ソート、中国語のピンイン文字によるソート

MySQL の通常のソート、カスタム ソート、中国語のピンイン文字によるソート。実際の SQL を記...

フレックスレイアウトが子要素によって引き伸ばされたときに、コンテンツをコンテナ内に保持する方法

モバイル デバイスでは、フレックス レイアウトが非常に便利です。デバイスの幅に応じてコンテナーの幅を...

Linux で crond ツールを使用してスケジュールされたタスクを作成する方法

序文Crond は Linux のスケジュール実行ツール (Windows のスケジュールされたタス...

Linux での MySQL 5.7.19 のインストールに関する問題の概要

初めて仮想マシンに MySQL をインストールしたとき、多くの問題が発生しました。ここでそれらを書き...

MySQLデータベースにパスワードを入力した後にフラッシュバックする問題の解決策

パスワード入力後にMySQLデータベースがクラッシュする問題と解決策1 ケースの説明最近、基本的な機...

データベースミドルウェアMyCatの紹介

1. Mycatの適用シナリオMycat は幅広いシナリオに合わせて開発されており、新しいユーザーが...

Firefox ブラウザでバックグラウンド ミュージックを再生するための究極のソリューション (Chrome マルチブラウザ対応)

FirefoxでBGMを再生するための推奨コードがテストに合格しました空のコントロールパネルを開いて...

GitHub のサードパーティ認証方式を Vue で実装する例

目次OAuth アプリの作成コードを取得するaccess_tokenを取得するユーザー情報を取得する...

CSS を使用して画像の下の空白を数ピクセル消去する方法の詳細な説明

最近、友人が私に質問をしました。ページをレイアウトすると、画像の下に 1 ~ 2 ピクセルの空白があ...

MySQL シリーズ 3 基礎

目次チュートリアルシリーズ1. MySQL の紹介2. MySQLの開発履歴3. MariaDBの基...

MySQL Null は 5 つの問題を引き起こす可能性があります (すべて致命的)

目次1. カウントデータが失われる解決2. 明確なデータ損失3.データ損失を選択解決4. Nullポ...