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

推薦する

CentOS7 systemdにカスタムシステムサービスを追加する方法

システムド: CentOS 7のサービスsystemctlスクリプトは、/usr/lib/syste...

HTML テーブルタグチュートリアル (25): 垂直配置属性 VALIGN

垂直方向では、行の配置を上、中央、下に設定できます。基本的な構文<TR VALIGN=&quo...

CSS でフローティングにより親要素の高さが崩れる問題を解決するいくつかの方法

1. ドキュメントフローとフローティング1. ドキュメントフローとは何ですか? HTML では、ドキ...

スクロール時に選択領域のフォント色を暗くするために CSS を使用するサンプルコード

日付ピッカーをカプセル化する場合、選択時にフォントの色を暗くする必要があります。実装後の効果を見てみ...

FTP環境設定ソリューション(vsftpd)の詳細な説明

1. vsftpdコンポーネントをインストールするインストールコマンド: [root@ink4t ~...

HTML の iframe と frame の違いを例を使って説明します

プロジェクトで frameset 属性を使用したことがあるかどうかはわかりません。昨年、オンライン ...

初心者向けウェブサイト構築チュートリアルの概要

これら 6 つの記事を書いた後、私は少し混乱し始めました。次にどこに書けばいいのか分かりません。ドメ...

js を使ってシンプルな虫眼鏡効果を実現

この記事の例では、参考までに簡単な虫眼鏡効果を実現するためのjsの具体的なコードを共有しています。具...

Win10 への MySQL 5.7 のインストール MSI 版のチュートリアル(画像とテキスト付き)

主にインストール後に my.ini ファイルを確認するために、msi 形式でインストールしました。フ...

Linux で利用可能なネットワーク インターフェイスを表示する方法

序文Linux システムをインストールした後の最も一般的なタスクは、ネットワーク構成です。もちろん、...

Vue ライフサイクルの紹介とフック関数の詳細な説明

目次Vueライフサイクルの紹介とフック機能VUEライフサイクルフックVue ライフサイクルの紹介作成...

MySQL InnoDB row_id 境界オーバーフロー検証方法の手順

背景クラスメートと row_id の境界問題について話し合ったので、ここで詳しく説明します。 Inn...

MySQL DEFINER の使用方法の詳細な説明

目次序文: 1.DEFINERの簡単な紹介2. いくつかの注意点要約:序文: MySQL データベー...

KVM 仮想化のインストール、展開、管理のチュートリアル

目次1.kvmの展開1.1 kvmのインストール1.2 kvm Web管理インターフェースのインスト...