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 アカデミー

推薦する

TypeScript での関数オーバーロード

目次1. 関数シグネチャ2. 関数のオーバーロード2.1 オーバーロードされたシグネチャは呼び出し可...

Eclipse は Tomcat を構成しますが、Tomcat には無効なポート解決策があります

目次1. EclipseがTomcatを構成する2. Tomcat の無効なポートの解決方法方法1:...

MySQL SQL文の特殊処理文のまとめ(必読)

1.テーブル全体を更新します。データ行の列の値が空の場合は、別の列フィールドの値と同じにします。 ...

Vue elementUI フォームのネストされたテーブルと各行の検証の詳細な説明

目次エフェクト表示コードリンクキーコード表形式データコンポーネントのネスト検証方法リセット方法完全な...

Docker環境でMySQLを実行し、Binlogを有効にしてマスタースレーブ同期を構成する方法

同じサーバーで、Docker を使用して Mysql のマスター スレーブ同期設定をシミュレートしま...

IDEA で Docker を WSL2 にデプロイする詳細なプロセス

ローカル環境はWindows10+WSL2(Ubuntu)です。サーバーにDockerをインストール...

JavaScriptは双方向リンクリストプロセス分析を実装します

目次1. 二重連結リストとは何か2. 双方向リンクリストのカプセル化3. 双方向リンクリストの一般的...

MySQL Binlog ログ処理ツールの比較分析

目次運河マクスウェルデータバスAlibaba Cloud のデータ転送サービス (DTS)運河ポジシ...

Tomcatの動作原理を分析する

SpringBoot は巨大な Python のようで、ゆっくりと私たちの周りを巻きつき、麻痺させま...

MySQL マスタースレーブ同期の原理と応用

目次1. マスタースレーブ同期原理マスタースレーブ同期アーキテクチャ図(非同期同期)マスタースレーブ...

MacOS で Docker を使用して MySQL マスター スレーブ データベースを作成する方法

1. MySQLイメージを取得するターミナルから最新のMySQLイメージを取得するdocker pu...

Docker コンテナのマウントディレクトリ操作の表示

Dockerコンテナのマウントディレクトリ情報のみを表示する docker 検査 --format ...

CocosCreatorがスキル冷却効果を実装

CocosCreatorがスキルCD効果を実現多くのゲームにはスキルがあります。プレイヤーがスキルボ...

CSS3 で画像ドロワー効果を実装するためのサンプル コード

いつものように、まずは画像効果を投稿しましょう: このエフェクトの原理は非常にシンプルです。CSS3...