Vue カプセル化コンポーネント ツール $attrs、$listeners の使用

Vue カプセル化コンポーネント ツール $attrs、$listeners の使用

序文

複数レベルのコンポーネントのネストでデータ転送が必要な場合、一般的に使用される方法は vuex を使用することです。しかし、中間処理なしでデータを渡すだけで、処理に vuex を使用するのは、少しやりすぎです。したがって、通常は inheritAttrs と一緒に使用される 2 つの属性、$attrs と $listeners があります。

$属性

親コンポーネントからカスタム子コンポーネントに渡されるプロパティは、プロパティ レシーバーがない場合、子コンポーネント内の最も外側のタグに自動的に設定されます。クラスとスタイルの場合は、最も外側のタグのクラスとスタイルがマージされます。

子コンポーネントが親コンポーネントから渡された非プロパティ属性を継承したくない場合は、inheritAttrs を使用して継承を無効にし、v-bind="$attrs" を通じて目的のタグに渡された外部の非プロパティ属性を設定できますが、これによってクラスとスタイルは変更されません。

inheritAttrs 属性の公式ウェブサイト リンク

2.4.0 新機能

タイプ: ブール値

デフォルト値: true

詳細:

デフォルトでは、プロパティとして認識されない親スコープの属性バインディングは「フォールバック」され、子コンポーネントのルート要素に通常の HTML 属性として適用されます。ターゲット要素または別のコンポーネントをラップするコンポーネントを作成する場合、これが必ずしも期待どおりの動作になるとは限りません。 inheritAttrs を false に設定すると、このデフォルトの動作は削除されます。これらの属性は、インスタンス プロパティ $attrs (これも 2.4 の新機能) を通じて有効にすることができ、v-bind を通じてルート以外の要素に明示的にバインドできます。

注: このオプションはクラスとスタイルのバインディングには影響しません。

例:

親コンポーネント

<テンプレート>
  <私の入力
      必須
      placeholder="コンテンツを入力してください"
      タイプ="テキスト"
      クラス="テーマダーク"
  />
</テンプレート>

<スクリプト>
MyInput を './child' からインポートします。
エクスポートデフォルト{
  名前: '親'、
  コンポーネント:
    マイインプット
  }
}
</スクリプト>

サブコンポーネント

<テンプレート>
  <div>
    <入力
        v-bind="$attrs"
        クラス="フォームコントロール"
    />
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'MyInput',
  継承属性: false
}
</スクリプト>

子コンポーネントは親コンポーネントから渡された値を受け入れず、バインドもしませんが、属性v-bind="$attrs"を使用すると、自動的に受け入れてバインドします。

継承属性: false

継承属性: true

$listeners (公式説明)

listeners: 親スコープ内の v-on イベント リスナーが含まれます (.native 修飾子なし)。これは、v-on="$listeners" を介して内部コンポーネントに渡すことができます。これは、より高レベルのコンポーネントを作成するときに非常に便利です。

まず、コードを見てみましょう。ここでは、フォーカス イベントと入力イベントのみを例として取り上げます。

// 親コンポーネント <テンプレート>
  <私の入力
      必須
      プレースホルダー
      クラス="テーマダーク"
      @focue="フォーカスオン"
      @input="入力時"
  >
  </my-input>
</テンプレート>
<スクリプト>
MyInput を './child' からインポートします。
エクスポートデフォルト{
  コンポーネント:
    マイインプット
  },
  メソッド: {
    オンフォーカス(e) {
      console.log(e.target.value)
    },
    オン入力(e) {
      console.log(e.target.value)
    }
  }
}
</スクリプト>
// サブコンポーネント <テンプレート>
  <div>
    <入力
        タイプ="テキスト"
        v-bind="$attrs"
        クラス="フォームコントロール"
        @focus="$emit('focus', $event)"
        @input="$emit('input', $event)"
    />
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'MyInput',
  継承属性: false
}
</スクリプト>

このようにネイティブ イベントをバインドするのは非常に面倒です。すべてのネイティブ イベントをバインドする必要がありますが、v-on="$listeners" を使用すると、多くの手間が省けます。

 <入力
        タイプ="テキスト"
        v-bind="$attrs"
        クラス="フォームコントロール"
+ v-on="$リスナー"
- @focus="$emit('focus', $event)"
- @input="$emit('input', $event)"
    />

この1行のコードで、すべてのネイティブイベントをバインドする問題を解決できます。

使用シナリオ

コンポーネントが値を渡すときに使用します。祖父は父コンポーネントに値を渡し、父コンポーネントは $attrs を通じて父の props にないすべての属性を取得します。父コンポーネントは孫コンポーネントに $attrs と $listeners をバインドし、孫コンポーネントが祖父から渡された値を取得し、祖父で定義されたメソッドを呼び出すことができるようにします。

一部の UI ライブラリの二次パッケージ化に使用されます。たとえば、element-ui のコンポーネントが独自の使用シナリオを満たせない場合は、二次パッケージ化されますが、独自のプロパティとメソッドを保持する必要があります。この場合、$attrs と $listners は最適なソリューションです。

要約する

Vue カプセル化コンポーネントの強力なツールである $attrs と $listeners の使用に関するこの記事はこれで終わりです。Vue カプセル化コンポーネントの $attrs と $listeners の使用に関する詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue2.xの$attrsと$listenersについて簡単に説明します。
  • vue $attrs と $listeners の使い方と違い
  • Vue で $props、$attrs、$listeners を使用する方法の詳細な説明
  • Vue で $attrs と $listeners を使用するチュートリアル
  • Vue $attrs と inheritAttr を使用してボタンを無効にした効果を実現する
  • Vue コンポーネント通信における $attrs と $listeners の実装原則の分析
  • vue $attrs の使用に関する包括的な分析

<<:  CSS3.0 でネオンボタンアニメーション効果を実装するためのサンプルコード

>>:  ウェブページの再設計の7つの主要要素 ウェブページの再設計の7つの主要要素を共有する

推薦する

Reactにおける不変値の説明

目次不変の値とは何ですか?不変の値を使用するのはなぜですか? Reactのパフォーマンス最適化は不変...

HTMLにスクリプトを追加する2つの方法と注意点

HTML に <script> スクリプトを追加する方法: 1. HTMLにJavaSc...

Docker で ElasticSearch をデプロイする方法

1. ElasticSearch とは何ですか? Elasticsearch も Java で開発さ...

Docker の MySQL コンテナのタイムゾーン問題の修正

序文Ahhang が Springboot プロジェクトを開発していたとき、フロントエンドから検証コ...

MySQL の乗算と除算の精度の不一致の問題 (除算後の小数点以下 4 桁)

質問今日、プロジェクト関数を書いていたとき、金額の統計計算を行い、単位を変換する必要がありました。そ...

複数の Docker コンテナが同じポート番号を持たない場合の解決策

背景Dockerでは、同じイメージを使用して4つのコンテナを作成します。ネットワークはブリッジモード...

高性能な HTML アプリケーションを作成するためのヒント

Web ページのパフォーマンスを向上させるにはどうすればよいでしょうか?ほとんどの開発者は、Java...

VUE ユニアプリライフサイクルに関する簡単な説明

目次1. アプリケーションライフサイクル2. ページのライフサイクルコンポーネントライフサイクル要約...

IDEA2020.1.2 Webプロジェクトの作成とTomcatの設定に関する詳細なチュートリアル

この記事は、IDEA で Web プロジェクトを作成し、Tomcat を構成する方法についての統合記...

Vue Element フロントエンドアプリケーション開発 従来の Element インターフェースコンポーネント

目次1. リストインターフェースとその他のモジュールの表示処理2. 従来のインターフェースコンポーネ...

MySQL 5.7 の一時テーブルスペースを使用して落とし穴を回避する方法

導入MySQL 5.7 は、SSL/TLS と全体的なセキュリティ開発におけるいくつかの重要な変更に...

画像のプリロードと遅延ロードを実装するJavaScript

この記事では、JavaScriptで画像のプリロードと遅延ロードを実装するための具体的なコードを参考...

Linux システムで TCP 接続を作成するプロセスの紹介

目次LinuxでTCPを作成する手順サーバクライアントTCP確立プロセスサンプルコードLinuxでT...

Vueを使用してタイマー機能を実装する

この記事の例では、タイマー機能を実装するためのVueの具体的なコードを参考までに共有しています。具体...

Dockerイメージ作成の完全なプロセス

目次序文作成手順CentOSベースイメージを作成するコンテナを作成してカスタマイズするカスタムコンテ...