Vue3 の emitting と attr の違いの分析

Vue3 の emitting と attr の違いの分析

結論は

親コンポーネントでカスタム イベントが定義されている場合、子コンポーネントで宣言されていない場合は、親コンポーネントの $attrs に自動的にバインドされます。ただし、子コンポーネントで宣言されている場合は、親コンポーネントの $attrs には表示されません。

実践分析

出力と属性の違いを確認するために、次のコンポーネント構造を構築します。

<div>
<com-one-vue/>
</div>
<div>
<com-one-vue/>
</div>

具体的な Vue ファイルとコードは次のとおりです (次の構文ではセットアップ構文シュガーが使用されていることに注意してください)。

アプリ.vue

<テンプレート>
<div>
コンポーネント 1 (楽しいイベントがあるが、emits では宣言されていない)
<com-one-vue @fun = 'call'/>
</div>
<div>
コンポーネント 1 (および、emits で宣言された fun2 イベント)
<com-one-vue @fun2 = 'call'/>
</div>
</テンプレート>
​
<スクリプトの設定>
'@vue/runtime-core' から provide, ref をインポートします。
'./components/comOne.vue' から comOneVue をインポートします。
'./components/comTwo.vue' から comTwoVue をインポートします。
'./components/comThree.vue' から comThreeVue をインポートします。
定数呼び出し = () => {
  コンソールログ('xx')
}
</スクリプト>

comOne.vue

<テンプレート>
    <button @click="f">ヘイヘイ</button>
</テンプレート>
​
<スクリプトの設定>
"@vue/runtime-core" から {useAttrs } をインポートします。
const 出力 = defineEmits(['fun2'])
定数 onFun は useAttrs() です。
定数f = () => {
    if(onFun)
    オンファン()
    出力('fun2')
}
コンソールログ(useAttrs())
</スクリプト> 

次に、コンソールを開くと次のことがわかります。

2 つのコンポーネント 1 では、最初のコンポーネント 1 のカスタム メソッド fun が emittings で宣言されていないため、その $attrs に onFun が表示され、その型はメソッドになります。

2 番目のコンポーネント 1 では、カスタム メソッド fun2 を定義しました。最初に子コンポーネントで fun2 を定義したため、2 番目のコンポーネント 1 の $attrs には fun2 は追加されません。

両方のコンポーネントはコンポーネント 1 ですが、カスタム イベントは互いに影響を及ぼさないことに注意してください。そのため、 fun カスタム メソッドは 2 番目のコンポーネント 1 の $attrs に表示されません。

同時に、2 つのボタンをクリックすると、fun メソッドと fun2 メソッドの両方が結果を出力していることがわかります。

したがって、この場合、これら 2 つの使用法の効果に違いはありません。

拡張機能

先ほどのデモを通じて、emits と attrs の使い方の違いや詳細がわかりましたが、実際にはほとんどの場合、両者の機能に違いはありません。では、どのように使用すればよいのでしょうか。

まず、emit は子コンポーネントで最初に宣言され、親コンポーネントによって参照されますが、attr は親コンポーネントによって子コンポーネント上で最初にカスタマイズされ、子コンポーネントは親コンポーネントの attr を参照してそれを使用します。この違いにより、イベントの使用法と特性に基づいて、どの方法を使用するかを決定できます。

  • コンポーネントがカスタム イベントを通じて親コンポーネントと頻繁に通信する必要がある場合は、emits を使用できます。
  • 親コンポーネントがカスタム イベントを通じて子コンポーネントと通信する必要があるが、その頻度は高くない場合は、 attrs を使用できます。ただし、親コンポーネントはカスタムイベントを通じて子コンポーネントと通信できない可能性があるため、対応する属性があるかどうかを判断する必要があります(ない場合は、未定義のエラーが発生します)。

これら 2 つの用途に関する公式見解を見てみましょう。

各コンポーネントによって発生したすべてのイベントを記録するには、emits を使用することを強くお勧めします。
これは、.native 修飾子を削除したため特に重要です。出力で宣言されていないイベント リスナーは、コンポーネントの $attrs にカウントされ、デフォルトでコンポーネントのルート ノードにバインドされます。

Vue3 では、.native 修飾子を削除すると、カスタム コンポーネントであるかどうかに関係なく、すべてのイベントが実際にコンポーネントの attrs に記録されます。次のように:

したがって、独自のカスタム イベントとネイティブ イベントを区別する必要がある場合は、emits を使用して各コンポーネントによってトリガーされるイベントを定義するのが最適です。同時に、実際には、emits で宣言されていない限り、すべてのイベントは、カスタム イベントに限定されず、デフォルトで親コンポーネントの attrs にバインドされます。

要約する

Vue3 の emitting と attrs の違いについての記事はこれで終わりです。Vue3 の emitting と attrs の違いについてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3 の使用 (パート 1) Vue CLI プロジェクトの作成
  • Vue3 の父子値転送に関する簡単な説明
  • Vue3における非親子コンポーネント通信の詳細な説明
  • vue3で注意すべき2つのポイントを詳しく解説:セットアップ
  • vue3 再帰コンポーネントカプセル化の全プロセス記録
  • Vue3 (パート 2) Ant Design Vue の統合

<<:  シンプルな HTML ビデオ プレーヤーを実装する方法

>>:  WindowsにOpenSSLをインストールし、OpenSSLを使用して公開鍵と秘密鍵を生成します。

推薦する

MySQL マスタースレーブレプリケーション 読み書き分離の設定方法の詳細説明

1. 説明前回は、MySQL のインストールと構成、MySQL ステートメントの使用、MySQL デ...

WeChatミニプログラムページ間の価値転送を実装する方法の例

ミニプログラムページ間で値を渡すみなさんこんばんは。こんばんはと言うのは、これを夜に書いたからです。...

要素フォーム検証で検証プロンプトをクリアする方法

目次問題のシナリオ:解決: 1. フィールドを個別にチェックする2. フォームフィールドの下のフィー...

マルチポートおよびマルチドメイン名アクセスのNginx構成の実装

サーバーに複数のサイトを展開するには、異なるサイトにアクセスするために複数のポートを開く必要がありま...

iframeノードの初期化の問題に関する議論

今日、ふとリッチテキストエディタの制作原理を見直してみようと思いました。それで、彼は何も言わずにそれ...

JDBC が MySQL に接続して中国語を処理するときに文字化けする問題の解決方法の詳細説明

JDBC が MySQL に接続して中国語を処理するときに文字化けする問題の解決方法の詳細説明最近、...

単一の Nginx IP アドレスに複数の SSL 証明書を設定する例

デフォルトでは、Nginx は IP アドレスごとに 1 つの SSL 証明書のみをサポートします。...

MySQL SHOW PROCESSLISTはトラブルシューティングの全プロセスを支援します

1. SHOW PROCESSLISTコマンドSHOW PROCESSLIST は実行中のスレッド ...

CentOSバージョンにDockerをインストールする際のエラーの解決方法

1. バージョン情報 # cat /etc/system-release CentOS Linux ...

MySQL はどのようにしてデータの整合性を確保するのでしょうか?

オンライン ビジネスにとってデータの一貫性と整合性が重要であることは明らかです。データが失われないよ...

Linuxファイルシステム操作の実装

この読書ノートでは、主にファイルシステムに関連する操作を記録します。ディスクとディレクトリの容量ディ...

nginx を使用してブルーグリーン デプロイメントをシミュレートする方法

この記事では、ブルーグリーン デプロイメントと、nginx を使用してブルーグリーン デプロイメント...

MySQL 5.5.56 インストール不要版の設定方法

MySQL 5.5.56無料インストール版の設定方法をテキストコードで詳しく説明します。具体的な内容...

Tomcat で server.xml と content.xml を変更した後の自動復元の問題の解決方法

設定ファイルを server.xml と content.xml に書き込みます。サーバーを再起動す...

Dockerコンテナイメージからコードを復元する手順

コードが失われ、コンテナ内で実行されているイメージから必要なコードを回復する必要がある場合があります...