v-model 双方向バインディングデータを実装する vue カスタム コンポーネントのサンプル コード

v-model 双方向バインディングデータを実装する vue カスタム コンポーネントのサンプル コード

プロジェクトでは、プロジェクトが呼び出すカスタム パブリック コンポーネントに遭遇します。通常、props を使用してパラメータを定義し、親コンポーネントから渡されたパラメータを受け取り、子コンポーネントの $emits() メソッドを通じて親コンポーネントにデータを返すことができます。

次のようなもの:

親コンポーネント

<common-checkbox :checked="goodsSelected" class="left" :height="'16px'" :width="'16px'" @checkChange="checkChange"></common-checkbox>

     /**
     * 処理のためのサブコンポーネントフィードバックを受け取る */
    チェック変更(値) {
      this.goodsSelected=value //サブコンポーネントのデータを親コンポーネントに割り当てる}

サブコンポーネント

    /**
     * 選択したポストバックを切り替える */
    トグルチェック(値) {
      this.$emit('changeCheck', value)// return メソッド、子コンポーネントの変更されたデータを親コンポーネントに返して処理します}

しかし、この書き方だと、パブリック コンポーネントを呼び出すページに追加の処理メソッドを記述する必要があり、低レベルすぎるように思えます。フレームワークに付属するパブリック コンポーネントのように、直接 v-model 双方向バインディングを宣言することはできますか?次に、プロジェクトで実際に遭遇するこの状況に対する解決策を示します。

最初の方法:

通常、親コンポーネント内の子コンポーネントに v-model 属性をバインドすると、子コンポーネントはデフォルトで v-model にバインドされたデータに設定され、子コンポーネントの value という名前の props 属性に割り当てます。ただし、値は子コンポーネントの props で事前に宣言する必要があります。宣言しないと、値は受信されません。

値が変更されても、両方向ともすぐに親コンポーネントに返されるわけではありません。親コンポーネントのv-modelを同期的に更新したい場合は、次のようにする必要があります。

 this.$emit('入力', 値) 

双方向バインディングリターンのイベントが宣言されていない場合、デフォルトでは入力イベントによって返されます。なぜ「双方向バインディングリターンのイベントが宣言されていない場合」と言われているのでしょうか? これは、以下で説明する 2 番目の方法です。

簡単に言うと、これを実装する最初の方法は、まず親コンポーネントのデータを v-model にバインドし、次に子コンポーネントの値の props プロパティを自動的に受け取り、最後に this.$emit('input', value) を呼び出して、データが変更されたときに親コンポーネントに渡すことです。このようにして、親コンポーネントは、子コンポーネントの戻り値を追加で実装することなく、双方向バインディングを実現できます。

2番目の方法:

先ほど、「双方向バインディング コールバック イベントが宣言されていない場合」は、デフォルトで入力コールバックが使用されると説明しました。その場合、入力コールバックが存在します。入力を使用しない場合はどうなりますか?これには、Vue の特別なプロパティである model を理解する必要があります。このプロパティを使用して、子コンポーネントが双方向バインドされたデータを受信するために使用するフィールドと、親コンポーネント v-model のデータを更新するために使用するメソッド コールバックを宣言できます。記述方法は次のとおりです。

エクスポートデフォルト{
  名前: 'CommonCkeckBox',
  モデル: {
    プロパティ: 'チェック済み'、
    イベント: 'changeCheck'
  },
    小道具: {
    チェック済み:
      タイプ: ブール値、
      デフォルト: false、
    }, // 選択状態}
  }

この書き方は、親コンポーネントの双方向バインディング データが、checked という名前の子コンポーネントの props プロパティにバインドされ、子コンポーネントが this.$emit('changeCheck', value) を呼び出すと、親コンポーネントのデータが同期的に更新され、双方向バインディングが実現されることを意味します。

以下は参考用のカスタム チェックボックス コードです。

<テンプレート>
<div class="チェックボックスコンテナ" @click="toggleCheck()" :style="{width:width,height:height}">
        <div class="チェックボックスアイコン">
              <!-- 3 つの状態: 選択、選択解除、無効 -->
              <img alt :src="`${$cdnImageUrl}/cart/icon-selected.png`" :width="幅" :height="高さ" key="選択" v-if="チェック済み&&!無効"/>
              <img alt :src="`${$cdnImageUrl}/cart/icon-unselected.png`" :width="幅" :height="高さ" key="未選択" v-if="!チェック済み&&!無効" />
              <img alt :src="`${$cdnImageUrl}/cart/icon-unselected.png`" :width="幅" :height="高さ" class="disabled" key="未選択" v-if="disabled"/>
            </div>
        <スロット></スロット>
</div>
</テンプレート>
<スクリプト>
/**
 * グローバル統合ポップアップウィンドウ */
エクスポートデフォルト{
  名前: 'CommonCkeckBox',
  モデル: {
    プロパティ: 'チェック済み'、
    イベント: 'changeCheck'
  },
  小道具: {
    チェック済み:
      タイプ: ブール値、
      デフォルト: false、
    }, // 選択状態が無効: {
      タイプ: ブール値、
      デフォルト: false、
    }, // 無効にするかどうか width: {
      タイプ: 文字列、
      デフォルト: '16px'、
    }, //ボタンのデフォルトの幅と高さ: {
      タイプ: 文字列、
      デフォルト: '16px'、
    }, //ボタンのデフォルトの高さ},
  作成された() {
  },
  データ() {
    戻る {
    }
  },
  メソッド: {
    /**
     * 選択したポストバックを切り替える */
    トグルチェック() {
      this.$emit('changeCheck', !this.checked)
      this.$emit('toggleCheck')
    }
  },
  時計:
    チェック済み:
      ハンドラ(新しい値、古い値) {
      //状態変更イベントを開く this.$emit('onChange')
      },
      深い: 本当
    }
  },
}
</スクリプト>
<style lang="scss" スコープ>
.チェックボックスコンテナ{
    表示: インラインブロック;
    .チェックボックスアイコン{
        画像{
          変換: translateZ(0);
          変更内容: 自動;
        }
        。無効{
          背景色:#f5f5f5;
          境界線の半径: 50%;
        }
    }
}
</スタイル>

親コンポーネント:

      <common-checkbox v-model="item.goodsSelected" class="left" :width="'16px'" :height="'16px'"></common-checkbox>

使用する具体的な方法は、プロジェクトのシナリオによって異なります。最初の方法が要件を満たさない場合は、2 番目の方法を試すことができます。

要約する

これで、v-model 双方向バインディング データを実装するための vue カスタム コンポーネントに関するこの記事は終了です。より関連性の高い vue v-model 双方向バインディング データ コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

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

<<:  Windows 10 での MySQL 8.0.22 のインストールと設定方法のグラフィック チュートリアル

>>:  HTML ハイパーリンク タグ_Powernode Java アカデミー

推薦する

MySQL の主キーがクエリを高速化するために数値を使用するか UUID を使用するかについての簡単な分析

実際の開発では、MySQL の主キーは重複できず、主キーが自動的にインクリメントされることがあります...

MySQLを安全にシャットダウンする方法

MySQL サーバーをシャットダウンする場合、シャットダウン方法に応じてさまざまな問題が発生する可能...

CSS 評価効果の星の例

何?何のスターコートですか?さて、もっとわかりやすくするために写真を見てみましょう。 よく見ると、パ...

MySQLの認可コマンド grant の使い方のまとめ

MySQL 認証コマンド grant の使用方法:この記事の例は MySQL 5.0 以降で実行され...

Tomcat ディレクトリ構造の詳細な紹介

tomcat の解凍されたディレクトリを開くと、次のディレクトリ構造が表示されます。 1.Tomca...

CentOS 7 で Python を 3.6.6 にアップグレードした後に発生する yum エラー問題の解決方法の概要

最近、テスト サーバーのオペレーティング システムを Cent0S 7.5 にアップグレードし、Py...

mysql5.7.21.zip インストールチュートリアル

mysql5.7.21 zipの詳細なインストール手順は次のとおりです。 1. 解凍して指定されたデ...

HTMLにビデオを挿入してすべてのブラウザと互換性を持たせる方法

HTML にビデオを挿入するために最もよく使用される方法は 2 つあります。1 つは古い <o...

JS+AJAX は、州、市、地区のドロップダウン リストのリンクを実現します。

この記事では、州、市、地区のドロップダウンリストのリンクを実現するためのJS + AJAXの具体的な...

IdeaでMySQLデータベースに接続すると中国語の文字化けが発生する問題

問題: JDBCを使用してMySQLデータベースに接続すると、中国語の文字を挿入すると文字化けした文...

Vueはカスタム命令を使用してページの下部に透かしを追加します

プロジェクトシナリオプロジェクトの背景全体にカスタム透かしを追加します。透かしのテキスト、フォントの...

MySQL の replace と replace into の詳細な例 into_Mysql

MySQL の replace と replace into はどちらも頻繁に使用される関数です。...

Vue SPA ファースト スクリーン最適化ソリューション

目次序文最適化ソ連オンデマンドインポート1. ルーティングファイルでコンポーネントをオンデマンドでイ...

オンラインMySQLオプティマイザの誤判断によって発生した低速クエリイベントを記録する

序文:非常に遅いクエリとリクエストのタイムアウトのアラートを受け取りました。メトリックを通じて My...

Vueのカスタムディレクティブの詳細なガイド

目次1. カスタム指示とは何ですか? 2. 指示をカスタマイズする方法フック機能3. 応用シナリオ入...