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

推薦する

一般的でない js 演算演算子の概要

目次2. カンマ演算子3. JavaScript Null 結合演算子 (??) 4. JavaSc...

純粋な CSS でカスタムラジオボタンとチェックボックス機能を実装する

1. 効果を達成する 2 知識ポイント2.1 <label> タグHTML では、<...

Docker-compose インストール yml ファイルの設定方法

目次1. オフラインインストール2. オンラインインストール3. アンインストール4. ymlファイ...

フレックスレイアウトの互換性の問題の概要

1. W3C バージョンの flex 2009年版フラグ: display: box; または bo...

mysql 変数の使用例の分析 [システム変数、ユーザー変数]

この記事では、例を使用して MySQL 変数の使用方法を説明します。ご参考までに、詳細は以下の通りで...

Prometheus を使用して、MySQL の自動増分主キーの残りの使用可能パーセンテージをカウントします。

最近、本番環境のデータベースがログデータを狂ったように書き込み、主キー値のオーバーフローを引き起こし...

フォームにファイルをアップロードした後にアクションを保存するよう促す理由と解決策

jsonデータはhtml形式で返される必要がありますつまり、 response.setContent...

Linux でのデータベースのスケジュールバックアップの実装スクリプト

目次シナリオ: サーバーデータベースを毎日定期的にバックアップする必要がある1. まずバックアップス...

JavaScriptで配列かどうかを判断するためのさまざまな方法のまとめ

目次序文配列.isArrayコンストラクタインスタンスプロトタイプオブジェクト.プロトタイプ.toS...

MySQL サービスを完全に削除する方法 (レジストリをクリーンアップする)

序文あるプロジェクトの実行可能ファイルをインストールすると、MySQL 自体をインストールできるよう...

Vue プロジェクトのパッケージ化と最適化の実装手順

目次Vueプロジェクトのパッケージ化、起動、最適化Vueプロジェクトのパッケージ化プロジェクトホステ...

MySQLの始め方から諦め方まで徹底解説 - インストール

学ぶ内容1. ソフトウェアのインストールとサーバーの設定。 2. (オプションですが、強くお勧めしま...

初心者向け入門チュートリアル④:サブディレクトリのバインド方法

これが何を意味するのかを理解するには、まずサブディレクトリとは何かを知る必要があります。では、サブデ...

Power Shell に vim 実装コード例を追加する方法

1. Vimの公式ウェブサイトにアクセスして、オペレーティングシステムに適した実行ファイルをダウンロ...

html5 の新しいメソッドを使用して JavaScript で要素クラス名を操作する方法の詳細な説明

目次1. classList属性2. 実用化以前の JavaScript では、最初にクラス属性を取...