Vue のディスパッチとブロードキャストの自己実装の詳細説明 (ディスパッチとブロードキャスト)

Vue のディスパッチとブロードキャストの自己実装の詳細説明 (ディスパッチとブロードキャスト)

解決すべき問題

主にコンポーネント間のクロスレベル通信用

なぜディスパッチとブロードキャストを自分で実装する必要があるのでしょうか?

独立したコンポーネントやライブラリを開発する場合、サードパーティのライブラリに依存しないのが最善です。

provide と inject を使用しないのはなぜですか?

使用シナリオは主にサブコンポーネントが親コンポーネントのステータスを取得するためであるため、クロスレベルコンポーネント間でアクティブなプロビジョニングと依存性注入の関係が確立されます。
次に、うまく解決できないシナリオが 2 つあります。
親コンポーネントは子コンポーネントにデータを渡します (クロスレベルをサポートします)。
子コンポーネントは親コンポーネントにデータを渡します (クロスレベルをサポートします)。

コードは次のとおりです。

エミッター

関数ブロードキャスト(コンポーネント名、イベント名、パラメータ) {
 this.$children.forEach(child => {
  定数名 = 子.$options.name;

  if (名前 === コンポーネント名) {
   child.$emit.apply(child, [イベント名].concat(params));
  } それ以外 {
   // todo paramsが空の配列の場合、undefinedが返されます
   ブロードキャスト.apply(child、[コンポーネント名、イベント名].concat([パラメータ]));
  }
 });
}
エクスポートデフォルト{
 メソッド: {
  ディスパッチ(コンポーネント名、イベント名、パラメータ) {
   親を this.$parent || this.$root とします。
   name = parent.$options.name とします。

   while (親 && (!名前 || 名前 !== コンポーネント名)) {
    親 = 親.$parent;

    (親)の場合{
     名前 = 親.$options.name;
    }
   }
   (親)の場合{
    親.$emit.apply(親、[イベント名].concat(params));
   }
  },
  ブロードキャスト(コンポーネント名、イベント名、パラメータ) {
   ブロードキャスト.call(this、コンポーネント名、イベント名、パラメーター);
  }
 }
};

親.vue

<テンプレート>
 <div>
  <h1>私は親コンポーネントです</h1>
  <button @click="handleClick">イベントをトリガー</button> <child />
 </div>
</テンプレート>
<スクリプト>
「@/mixins/emitter.js」からエミッターをインポートします。
「./child」から子をインポートします。
エクスポートデフォルト{
 名前: "コンポーネントA",
 ミックスイン: [エミッター],
 作成された() {
  this.$on("child-to-p", this.handleChild);
 },
 メソッド: {
  ハンドルクリック() {
   this.broadcast("componentB", "on-message", "Hello Vue.js");
  },
  ハンドルChild(val) {
   アラート(val);
  }
 },
 コンポーネント:
  子供
 }
};
</スクリプト>

子.vue

<テンプレート>
 <div>私は子コンポーネントです</div>
</テンプレート>
<スクリプト>
「@/mixins/emitter.js」からエミッターをインポートします。
エクスポートデフォルト{
 名前: "コンポーネントB",
 ミックスイン: [エミッター],
 作成された() {
  this.$on("on-message", this.showMessage);
  this.dispatch("componentA", "child-to-p", "hello parent");
 },
 メソッド: {
  メッセージを表示(テキスト) {
   ウィンドウのアラート(テキスト);
  }
 }
};
</スクリプト>

このようにして、クロスレベル コンポーネントのカスタム通信を実現できます。ただし、1 つ問題があります。サブスクリプションはパブリッシュより前に行う必要があります。つまり、オンはエミットより前に行う必要があります。

親子コンポーネントのレンダリング順序、インスタンスの作成順序

子コンポーネントは親コンポーネントの前にレンダリングされるため、子コンポーネントのマウント イベントがディスパッチされても、親コンポーネントのマウントでは聞くことができません。
親コンポーネントの作成は子コンポーネントの作成に先行するため、親コンポーネントの作成を監視できます。

Vue の独自実装によるディスパッチとブロードキャスト (dispatch and broadcast) に関する記事はこれで終了です。Vue のディスパッチとブロードキャストに関するより関連性の高い内容については、123WORDPRESS.COM の過去記事を検索するか、引き続き以下の関連記事を閲覧してください。皆様、今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue SPA シングルページ アプリケーションの最初の画面の最適化の実践
  • 放送とディスパッチのVue実装例
  • vue-cli シングルページ事前レンダリング seo-prerender-spa-plugin 操作
  • vuex での store.commit と store.dispatch の使用
  • Vue SPAは最初に読み込みアニメーションの実装コードを入力します
  • Vueはデータテーブル行スパンの列を結合する効果を実現します
  • Vue SPA アプリケーションにおけるルーティング キャッシュの問題と解決策
  • Vuex の Dispatch が Vue+Electron では効果がない問題を解決する
  • VUEはWeChat署名とSPA WeChat無効署名問題を解決します(完璧な処理)
  • vuex のアクションがいつ完了するか、dispatch を正しく呼び出す方法について詳しく説明します。
  • Vue SPA ファースト スクリーン最適化ソリューション

<<:  MySQL 5.7 でルートパスワードを変更する方法

>>:  Linux で MongoDB のリモート自動バックアップを実装する方法

推薦する

マルチコア CPU を使用して Linux コマンドを高速化する方法 (GNU Parallel)

非常に大量のデータ(数百 GB)を計算する必要があったことはありますか?または、その内部を検索したり...

Dockerでパラメータ変数を外部から指定する方法

この記事は主にDockerでパラメータ変数を外部から指定する方法を紹介します。この記事のサンプルコー...

LinuxシステムにISOファイルをインストールする方法

Linux システムで iso ファイルをインストールするにはどうすればいいですか?インストール手順...

MySQL の完全なデータベース バックアップからデータベースとテーブルを復元する方法

公式の MySQL ダンプ ツールで、特定のデータベースのみを復元するにはどうすればよいですか?完全...

HTML で相対パスを使用してディレクトリのすべてのレベルのファイルを取得する方法の詳細な説明

相対パスの概念現在のファイルの場所を参照ポイントとして使用して、ターゲット ファイルへのパスを確立し...

Vueでフォーム検証を実装する方法

1. インストールと使用まず、Vue プロジェクトにインストールします。 npm インストール --...

MySQL InnoDBセカンダリインデックスのソート例の詳細な説明

ソート問題最近、Geek Time の「45 Lectures on MySQL Practice」...

JS で列挙をシミュレートする方法

序文現在の JavaScript には列挙の概念がありません。一部のシナリオでは、列挙を使用するとデ...

クロスブラウザ開発体験のまとめ(I)HTMLタグ

ページにDOCTYPEを追加するブラウザによってタグやスタイルシートの解釈が異なるため、さまざまなブ...

Docker でコンテナのポート マッピングを動的に変更する方法

前書き: Docker のポート マッピングは、多くの場合、Docker Run コマンド中に -p...

VUE+Canvasは、インゴットを受け取る富の神のゲームを実装します

前回のキャンバス ゲーム シリーズへようこそ: 《VUEがFlappy Birdを実装しました〜〜〜...

WeChatアプレットタブの左右スライドスイッチ機能実装コード

効果画像: 1. はじめに独自のアプレットでこのような機能を実装する必要がある1. 核となる考え方ス...

ダッシュボードを実装するためのjQueryプラグイン

jQueryプラグインは、参考のためにダッシュボードを実装します。具体的な内容は次のとおりです。一般...

Tomcat マルチレイヤーコンテナの設計に関する簡単な説明

目次コンテナ階層サーブレットの検索を要求するプロセス仕組みTomcat のコンテナは Servlet...

MySQLの再帰問題

MySQL自体は再帰構文をサポートしていませんが、自己接続を通じていくつかの単純な再帰を実現できます...