Vue で $props、$attrs、$listeners を使用する方法の詳細な説明

Vue で $props、$attrs、$listeners を使用する方法の詳細な説明

背景

ここで、状況について説明しましょう。親コンポーネントは孫コンポーネントとどのように通信するのでしょうか。解決策はいくつあるでしょうか。

  • データ管理には VueX を使用しますが、プロジェクト内の複数のコンポーネント間で共有される状態が少なく、プロジェクトが小さく、グローバル状態が少ない場合は、VueX を使用してこの機能を実装しても、 VueXのパワーが発揮されません。
  • B を中継ステーションとして使用します。コンポーネント A がコンポーネント C に情報を渡す必要がある場合、B はコンポーネント A から情報を受け取り、プロパティを使用してコンポーネント C に渡します。これは解決策ですが、ネストされたコンポーネントが多すぎると、コードが煩雑になり、保守が困難になります。Cの状態変化を A に渡す必要がある場合は、イベント システムを使用してレベルごとに渡します。
  • Vue 中央データ バスをカスタマイズします。これは、レベル間でメッセージを渡すコンポーネントに適しています。ただし、複数の人が共同作業する場合、コードの保守性と可読性が低下するという欠点があります。

1. 文書の説明

(1) $props : 現在のコンポーネントが受け取ったpropsオブジェクト。 Vue インスタンスは、その props オブジェクトのプロパティへのアクセスをプロキシします。

(2) $attrs :親スコープでプロパティとして認識(および取得)されない属性バインディング(クラスとスタイルを除く)が含まれます。

(3) $listeners : 親スコープ内のv-onイベントリスナーが含まれます(.native修飾子なし)。 v-on="listeners" を通じて内部コンポーネントに渡すことができます。

2. 特定の用途

1. 親コンポーネント

<テンプレート>
  <div>
    <div>親コンポーネント</div>
    <子供
      :foo="foo"
      :zoo="動物園"
      @handle="handleFun"
    >
    </子>
  </div>
</テンプレート>

<スクリプト>
'./Child.vue' から Child をインポートします。
エクスポートデフォルト{
  コンポーネント: { 子 },
  データ() {
    戻る {
      foo: 'foo',
      動物園: 「動物園」
    }
  },
  メソッド: {
    // イベントを渡す handleFun(value) {
      this.zoo = 値
      console.log('孫コンポ​​ーネントでクリックイベントが発生したので受信しました')
    }
  }
}
</スクリプト>

2. 子コンポーネント(Child.vue)

中間層は、親コンポーネントと孫コンポーネント間の伝送仲介者として、孫コンポーネントがデータを受信できるように、息子コンポーネント内の孫コンポーネントにv-bind="$attrs"を追加します。

$attrsは、zooなどの親コンポーネントから渡されるデータで、子コンポーネントはpropsを通じて受け取らない。

 <テンプレート>
  <div クラス = '子ビュー'>
    <p>子コンポーネント - {{$props.foo}} は {{foo} と同じ内容を持ちます。}</p>
    <GrandChild v-bind="$attrs" v-on="$listeners"></GrandChild>
  </div>
</テンプレート>

<スクリプト>
'./GrandChild.vue' から GrandChild をインポートします。
エクスポートデフォルト{
  // 親コンポーネントのコンテンツをすべて継承します。inheritAttrs: true,
  コンポーネント: { GrandChild },
  プロパティ: ['foo'],
  データ() {
    戻る {
    }
  }
}
</スクリプト>

3. 孫コンポーネント (GrandChild.vue)

孫コンポーネントでは、親コンポーネントから渡されたデータを受け取るためにpropsを使用する必要があります。

 <テンプレート>
  <div class='孫のビュー'>
    <p>孫コンポーネント</p>
    <p>孫コンポーネントに渡されたデータ: {{zoo}}</p>
    <button @click="testFun">クリックしてイベントをトリガーします</button>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  // 親コンポーネントのコンテンツをすべて継承せず、コンポーネントのルート要素 DOM に属性を表示しません。inheritAttrs: false,
  // このコンポーネントでは、親コンポーネントから渡されたデータを受け取る必要があります。props のパラメータ名は変更できないことに注意してください。親コンポーネントから渡された props と同じである必要があります: ['zoo'],
  メソッド: {
    テストファン(){
      this.$emit('handle', '123')
    }
  }
}
</スクリプト>

結論

上記のコードから、 attrs 属性inheritAttrs属性を使用すると、簡潔なコードを使用してコンポーネント Aのデータをコンポーネント Cに渡すことができることがわかります。このシナリオの使用範囲は非常に広範囲です。

listenersを通じて、コンポーネント b に v-on="$listeners" をバインドし、コンポーネント a で、コンポーネント c によってトリガーされたイベントをリッスンします。コンポーネント c によって送信されたデータはコンポーネント a に渡すことができます。

Vue における $props、$attrs、$listeners の詳細な使用法に関するこの記事はこれで終わりです。Vue の $props、$attrs、$listeners に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue での inheritAttrs の使用に関する詳細な説明
  • Vue $attrs と inheritAttr を使用してボタンを無効にした効果を実現する
  • Vue でコンポーネントのスケーラビリティを実装するための inheritAttrs の使用の概要
  • Vue3 $attrs と inheritAttrs の使用手順

<<:  MIME TYPEとは?MIME-Typesタイプコレクション

>>:  透明な入力ボックスにアイコンを追加する HTML コード

推薦する

LinuxカーネルとSVNバージョン間の競合の解決策

現象システムは Linux システムカーネルを正常にコンパイルできましたが、SVN をインストールし...

Dockerのローカルイメージ作成方法の分析

コンテナと呼ばれるものは、実際には親イメージに基づいて読み取りおよび書き込み可能なファイル階層を作成...

MySQL テーブル自動増分 ID オーバーフロー障害レビュー ソリューション

問題: MySQLテーブル内の自動増分IDのオーバーフローによりビジネスブロックが発生した背景: t...

SQL と NoSQL の違いのまとめ

主な違い: 1. タイプSQL データベースは主にリレーショナル データベース (RDBMS) とし...

Linux ドライバ開発でよく使われる関数 copy_from_user open read write の詳細な説明

目次Linux ドライバーの共通機能 (copy_from_user open read write...

Canonical が Flutter で Linux デスクトップ アプリを有効化 (推奨)

Google の Flutter の目標は、どのプラットフォームを使用していても、ネイティブの速度...

Windows で MySQL データベースを別のディスクに移動する

序文今日、MySQL をインストールしたところ、データベース ストレージがデフォルトで C ドライブ...

WindowsX Hyper-V ベースの CentOS システムをインストールする

現在、Linux を使用するほとんどの人は、クラウド サーバーを使用するか、Windows 上に仮想...

CentOS に MySQL 8.0 をインストールして設定するための詳細な手順

序文CentOS に MySQL をインストールして設定する手順は次のとおりです。文章yumソースか...

3Dカルーセル効果を実現するjs

この記事では、3Dカルーセル効果をjsで実装するための具体的なコードを参考までに共有します。具体的な...

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

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

Centos7 での Mysql5.7.19 の詳細なインストールチュートリアル

1. ダウンロード公式サイトからmysql-5.7.19-linux-glibc2.12-x86_6...

シェルを使用してMySQLデータバックアップスクリプトを作成する

アイデアそれは実はとても簡単ですシェル スクリプトを記述して、mysql の mysqldump を...

MySQLでデータベースデータ保存ディレクトリを変更する方法

序文MySQL データベースのデフォルトのデータベース ファイルは /var/lib/mysql に...

Django+vue 登録とログインのサンプルコード

登録するフロントエンドは、vue の axios を使用して値を渡し、取得したアカウントとパスワード...