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-connector-java8.0.27 へのアップグレードに関する注意事項

最近、オンライン セキュリティ スキャンにより、MySQL コネクタに脆弱性が見つかりました。確認し...

ページ リファクタリング スキル - Javascript、CSS

JS、CSSについてCS: ...上部のスタイルシートCSS式を避ける外部JS、CSSの使用JSと...

Webフロントエンド開発におけるエラーを見つけるための基本的な考え方

WEB開発は主に2つのインタラクション(B/Sデータ)から構成されますブラウザ: 1html、css...

Vue でコンポーネントを一括インポート、登録、使用する方法

序文コンポーネントは、非常に頻繁に使用されるものです。多くの人は、コンポーネントを 1 つのファイル...

MySQL Bツリーインデックスとインデックス最適化の概要についての簡単な説明

MySQL の MyISAM エンジンと InnoDB エンジンはどちらもデフォルトで B+ ツリー...

一般的なDockerコマンドの概要

Dockerのインストール1. 要件: Linuxカーネルバージョン3.10以上 表示: uname...

DockerでMySQLコンテナを作成する簡単な手順

序文すでに Docker をインストールしており、Docker について簡単に理解しています。ここで...

Mac に MySQL データベースをインストールし、環境変数を設定するためのグラフィック チュートリアル

目次MySQLをインストールする環境変数の設定MySQLをインストールするmysqlをダウンロードし...

MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化

ウェブサイトやサービスのパフォーマンスは、データベースの設計(適切な言語開発フレームワークを選択した...

MySQLデータベースについて学びましょう

目次1. データベースとは何ですか? 2. データベースの分類は? 3. データベースとデータ構造の...

MySQL ビューの原則分析

目次更新可能なビュービューのパフォーマンスビューの制限ビューは MySQL 5.0 以降で導入されま...

Vue を通じて QR コードスキャン機能を実装する

ヒントこのプラグインは https プロトコルでのみアクセスできます。http プロトコルはうまく機...

JavaScript 高度なカスタム例外

目次1. コンセプト1.1 エラーと例外とは何ですか? 1.2 異常の分類2. 例外処理2.1try...

CSSは親要素の下の最初の子要素を選択します(:first-child)

序文最近、プロジェクトで :first-child を使用したのですが、すぐに思いつきました。これは...

HTML マークアップ言語 - フォーム

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...