解決すべき問題主にコンポーネント間のクロスレベル通信用 なぜディスパッチとブロードキャストを自分で実装する必要があるのでしょうか?独立したコンポーネントやライブラリを開発する場合、サードパーティのライブラリに依存しないのが最善です。 provide と inject を使用しないのはなぜですか?使用シナリオは主にサブコンポーネントが親コンポーネントのステータスを取得するためであるため、クロスレベルコンポーネント間でアクティブなプロビジョニングと依存性注入の関係が確立されます。 コードは次のとおりです。 エミッター 関数ブロードキャスト(コンポーネント名、イベント名、パラメータ) { 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL 5.7 でルートパスワードを変更する方法
>>: Linux で MongoDB のリモート自動バックアップを実装する方法
非常に大量のデータ(数百 GB)を計算する必要があったことはありますか?または、その内部を検索したり...
この記事は主にDockerでパラメータ変数を外部から指定する方法を紹介します。この記事のサンプルコー...
Linux システムで iso ファイルをインストールするにはどうすればいいですか?インストール手順...
公式の MySQL ダンプ ツールで、特定のデータベースのみを復元するにはどうすればよいですか?完全...
相対パスの概念現在のファイルの場所を参照ポイントとして使用して、ターゲット ファイルへのパスを確立し...
1. インストールと使用まず、Vue プロジェクトにインストールします。 npm インストール --...
ソート問題最近、Geek Time の「45 Lectures on MySQL Practice」...
序文現在の JavaScript には列挙の概念がありません。一部のシナリオでは、列挙を使用するとデ...
ページにDOCTYPEを追加するブラウザによってタグやスタイルシートの解釈が異なるため、さまざまなブ...
前書き: Docker のポート マッピングは、多くの場合、Docker Run コマンド中に -p...
前回のキャンバス ゲーム シリーズへようこそ: 《VUEがFlappy Birdを実装しました〜〜〜...
効果画像: 1. はじめに独自のアプレットでこのような機能を実装する必要がある1. 核となる考え方ス...
jQueryプラグインは、参考のためにダッシュボードを実装します。具体的な内容は次のとおりです。一般...
目次コンテナ階層サーブレットの検索を要求するプロセス仕組みTomcat のコンテナは Servlet...
MySQL自体は再帰構文をサポートしていませんが、自己接続を通じていくつかの単純な再帰を実現できます...