Vue3.xはコンポーネント通信にmitt.jsを使用します

Vue3.xはコンポーネント通信にmitt.jsを使用します

Vue2.x はコンポーネント通信に EventBus を使用しますが、Vue3.x では mitt.js の使用が推奨されています。

Vue インスタンスでは、mitt.js は EventBus よりも優れている点は何ですか?まず、サイズが 200 バイトと非常に小さいです。次に、すべてのイベントの監視と一括削除をサポートしています。Vue インスタンスに依存しないため、フレームワーク間で使用できます。React や Vue、さらには jQuery プロジェクトでも同じライブラリを使用できます。

クイックスタート

npm インストール --save mitt

方法 1、グローバル バス、Vue エントリ ファイル main.js にグローバル プロパティをマウントします。

'vue' から {createApp} をインポートします。
'./App.vue' からアプリをインポートします。
「mitt」からmittをインポートする

const app = createApp(App)
app.config.globalProperties.$mybus = mitt()

方法 2:カスタム トランザクション バス ファイル mybus.js をカプセル化し、新しい js ファイルを作成して、使用したい場所にインポートします。

'mitt' から mitt をインポートする
デフォルトの mitt() をエクスポートする

方法 3:コンポーネントに直接インポートして使用します。分散型アプローチにより管理とトラブルシューティングが容易になるため、この方法を使用することをお勧めします。

<テンプレート>
  <img alt="Vue ロゴ" src="./assets/logo.png" />
  <HelloWorld メッセージ="こんにちは Vue 3.0 + Vite" />
</テンプレート>

<スクリプト>
'mitt' から mitt をインポートする
'./components/HelloWorld.vue' から HelloWorld をインポートします。

エクスポートデフォルト{
  コンポーネント:
    こんにちは世界
  },
  セットアップ(小道具){
    定数フォームアイテムMitt = mitt()
    戻る {
      フォームアイテムミット
    }
  }
}
</スクリプト>

使い方

実際、mitt の使用方法は EventEmitter と似ています。イベントは on メソッドで追加され、off メソッドで削除され、clear メソッドでクリアされます。

'mitt' から mitt をインポートする

定数エミッター = mitt()

// イベントをリッスンする
エミッター.on('foo', e => console.log('foo', e) )

// すべてのイベントをリッスンする
エミッター.on('*', (type, e) => console.log(type, e) )

// イベントを発生させる
エミッター.emit('foo', { a: 'b' })

// すべてのイベントをクリアする
エミッタ.すべて.クリア()

// ハンドラー参照の操作:
関数 onFoo() {}
emittingter.on('foo', onFoo) // 聞く
emittingter.off('foo', onFoo) // 聞き取りを停止

mitt を new ではなく関数呼び出しの形式でインポートしたことに注意してください。イベントを削除するときは、イベントを定義する関数の名前と参照を渡す必要があります。

基本原則

原理は非常に単純で、マップメソッドを通じて関数を保存することです。削除後、コードは 30 行未満になりました。

デフォルト関数mitt(all)をエクスポートする{
 すべて = すべて || 新しい Map();

 戻る {
  全て、

  on(タイプ、ハンドラ) {
   const ハンドラ = all.get(type);
   const が追加されました = handlers && handlers.push(handler);
   (!追加)の場合{
    all.set(type, [ハンドラ]);
   }
  },

  オフ(タイプ、ハンドラ) {
   const ハンドラ = all.get(type);
   if (ハンドラ) {
    handlers.splice(handlers.indexOf(handler) >>> 0, 1);
   }
  },

  出力(タイプ、イベント) {
   ((all.get(type) || [])).slice().map((handler) => { handler(evt); });
   ((all.get('*') || [])).slice().map((handler) => { handler(type, evt); });
  }
 };
}

Vue3 では、インスタンスから $on、$off、$once メソッドが完全に削除されました。 $emit は、親コンポーネントによって宣言的にアタッチされたイベントをトリガーするために使用されるため、引き続き既存の API の一部です。

これで、コンポーネント通信に mitt.js を使用する Vue3.x に関するこの記事は終了です。Vue3.x mitt.js コンポーネント通信に関する関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3における非親子コンポーネント通信の詳細な説明
  • Vue3における7種類のコンポーネント通信の詳細
  • Vue3 がコンポーネント通信に mitt を使用する手順
  • vue3 コンポーネント通信方法の概要と例

<<:  Linuxグループの基礎知識ポイントまとめ

>>:  MySQLにインデックスを追加する方法

推薦する

jsを使用してカルーセル効果を実現する

今日は、参考までに、jsを使用してカルーセルマップの効果を実現する方法についてお話ししましょう。具体...

非ルートユーザーを使用してDockerコンテナでスクリプト操作を実行する

アプリケーションをコンテナ化した後、Docker コンテナを起動すると、デフォルトで root ユー...

MySQLのunion allとunionの違いを簡単に理解する

Union は、重複行を除外し、デフォルトのソートを実行する、データに対する結合操作です。Union...

https ウェブサイトを展開し、Nginx でアドレス書き換えを構成するための詳細な手順

Nginx は、高性能な Web サイト サーバーおよびリバース プロキシ サーバーであり、IMAP...

Centos7 環境でバイナリ インストール パッケージから mysql5.6 をインストールする方法の詳細な説明

この記事では、centos7 環境でバイナリ インストール パッケージを使用して mysql5.6 ...

CSSのoutline-offsetプロパティを使用してプラス記号を実装する

次のような初期コードがあると仮定します。 <!DOCTYPE html> <htm...

Vueソースコード解析における仮想DOMの詳しい説明

なぜ仮想DOMが必要なのでしょうか?仮想 DOM はブラウザのパフォーマンス問題を解決するために設計...

MySQL のロックに関する問題

ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...

最適なウェブページ幅とその互換性のある実装方法

1. Web ページをデザインするときに、幅を決定するのは非常に面倒な作業です。 jb51.net ...

setup+ref+reactive は vue3 の応答性を実装します

セットアップは、結合された API を記述するために使用されます。テンプレートが使用できるようにする...

上部の固定divは半透明効果に設定できます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Docker の MySQL 時間とシステム時間の不一致の問題を解決する

最近、Docker に MySQL をインストールしたところ、データベースの時刻がシステム時刻と 8...

Vueは画像のズームとドラッグをサポートするリッチテキストエディタを統合しています

必要:ビジネス要件によると、写真をアップロードできる必要があり、アップロードされた写真はモバイル端末...

Web スライスとは何ですか?

IE8 の新機能 Web スライス (Web スライス) Microsoft は 3 月 20 日...

Vue3の一般的なAPIの使用方法の紹介

目次ライフサイクルの変化反応的な参照vue2.x では ref を使用して要素タグを取得します。vu...