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 コード

推薦する

JavaScriptエラーキャプチャの詳細な説明

目次1. 基本的な使い方とロジック2. 特徴3. エラーオブジェクト4. キャッチアンドスロー戦略の...

CSS3 でテキストマーキーを実装するためのサンプルコード

背景何が起こったかというと、Luzhu は偶然、宇宙で最高の外部スピーカーを備えた携帯電話について知...

Docker+gitlab+jenkins は、ゼロから自動デプロイメントを構築します

目次序文: 1. Dockerをインストールする2. DockerでJenkinsをインストールする...

MySql バージョンの問題に対する完璧なソリューション sql_mode=only_full_group_by

1. sql_modeを確認する @@sql_mode を選択照会された値は次のとおりです。 ON...

MySqlを最適化するためにnot inを使用する方法

最近、プロジェクトで選択クエリを使用する際に、未使用の主キー ID を除外するために not in ...

VUE ユニアプリコア知識の簡単な紹介

目次仕様a. ページファイルはVueの単一ファイルコンポーネント仕様に準拠しています。 b. コンポ...

Nginxサービス500:内部サーバーエラーの原因の1つ

500 (内部サーバー エラー) サーバーでエラーが発生したため、要求を完了できませんでした。 50...

JavaScript Promise の徹底解説

目次1. Promise とは何ですか? 2. なぜ Promise が存在するのでしょうか? 3つ...

繰り返し送信、繰り返し更新、バックオフ防止に関する問題と解決策の分析

1つ。序文<br />この種の質問は、どの専門掲示板でも見かけます。Google で検索...

ファイルアップロードスタイルの詳細を実装するjs

目次1. 概要2. オブジェクト作成のパラメータ3. 監視例4. 使用方法5. ソースコード1. 概...

Ubuntu16.04にCUDA9.0をインストールするための詳細なチュートリアル

序文:この記事は、CUDA 9.0 をインストールした経験に基づいています。CUDA 9.0 は現在...

露滴アニメーション効果を実装するための Three.js サンプル コード

序文みなさんこんにちは。CSS ウィザードの alphardex です。この記事では、three.j...

CentOS 7.5 に Python 3.6.6 を最初からインストールするための詳細なチュートリアル

ps: 環境はタイトル通りです依存関係をインストールする yum インストール openssl-de...

MySQL データベース開発の 36 の原則 (要約)

序文これらの原則は実際の戦闘から要約されています。あらゆる原則の背後には血なまぐさい教訓があるこれら...

MYSQL パフォーマンス アナライザー EXPLAIN 使用例分析

この記事では、例を使用して MYSQL パフォーマンス アナライザー EXPLAIN の使用方法を説...