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 のリモート自動バックアップを実装する方法

推薦する

Vue コンポーネント ライブラリ ElementUI はテーブル読み込みツリー データのチュートリアルを実装します

ElementUIは、参考のためにテーブルツリーリストの読み込みチュートリアルを実装しています。具体...

ウェブサイトのコンテンツの100~1%はナビゲーションである

ウェブサイトでは、コンテンツの(100-1)%がナビゲーションです1. ジェシー・ジェームズ・ギャレ...

HTML でマウスが停止したときに行全体の色 (tr) を変更する方法

純粋な CSS を使用して、マウスが行の上を通過するときに行の背景色を変更し、その行にフォーカスがあ...

JavaScript関数の詳細な紹介

任意の数のステートメントを関数を通じてカプセル化することができ、いつでもどこでも呼び出して実行できま...

HTML テーブル マークアップ チュートリアル (2): テーブル境界属性 BORDER

デフォルトでは、テーブルの境界線は 0 ですが、テーブルの境界線を設定できます。基本的な構文<...

Docker ベースの Selenium 分散環境の構築

1.画像をダウンロードするdocker pull selenium/hub docker pull ...

nginx を介して方向プロキシを実装するプロセスの図

この記事は主に、nginx を介して方向プロキシを実装するプロセスを紹介します。この記事のサンプル ...

メッセージボードにメッセージを追加および削除するための JavaScript

この記事では、JavaScript メッセージ ボードでメッセージを追加および削除する小さな例を詳細...

JSで実現したページサイドバーの効果に関する研究

目次発見: ディスプレイアニメーションの応用実装:記事の1行目を表示する効果を実現する方法実際、その...

Docker 環境で JMeter+Grafana+influxdb ビジュアル パフォーマンス監視プラットフォームを構築するチュートリアル

目次1. Dockerをインストールする2. influxDBをインストールして設定する3. Gra...

Linux の運用と保守で netstat の代わりに ss コマンドを使用する方法

序文Linux サーバーを操作および管理するときに、最もよく使用されるコマンドの 1 つが nets...

MySQL ステートメントの概要

目次1. データベースの使用を選択2. 情報を表示する3. テーブルを作成する4. データを挿入する...

Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析

目次1. システム環境2. 運用プロセスと途中で遭遇した問題1. システム環境1. Tencent ...

JavaScript を使用してソートアルゴリズムを実装する方法

目次バブルソート選択ソート挿入ソート要約するバブルソートバブルソートは、シーケンスの右側から始めて、...

CentOS IP接続ネットワーク実装プロセス図

1. システムにログインし、ディレクトリに入ります: cd /etc/sysconfig/netwo...