解決すべき問題主にコンポーネント間のクロスレベル通信用 なぜディスパッチとブロードキャストを自分で実装する必要があるのでしょうか?独立したコンポーネントやライブラリを開発する場合、サードパーティのライブラリに依存しないのが最善です。 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 のリモート自動バックアップを実装する方法
ElementUIは、参考のためにテーブルツリーリストの読み込みチュートリアルを実装しています。具体...
ウェブサイトでは、コンテンツの(100-1)%がナビゲーションです1. ジェシー・ジェームズ・ギャレ...
純粋な CSS を使用して、マウスが行の上を通過するときに行の背景色を変更し、その行にフォーカスがあ...
任意の数のステートメントを関数を通じてカプセル化することができ、いつでもどこでも呼び出して実行できま...
デフォルトでは、テーブルの境界線は 0 ですが、テーブルの境界線を設定できます。基本的な構文<...
1.画像をダウンロードするdocker pull selenium/hub docker pull ...
この記事は主に、nginx を介して方向プロキシを実装するプロセスを紹介します。この記事のサンプル ...
この記事では、JavaScript メッセージ ボードでメッセージを追加および削除する小さな例を詳細...
目次発見: ディスプレイアニメーションの応用実装:記事の1行目を表示する効果を実現する方法実際、その...
目次1. Dockerをインストールする2. influxDBをインストールして設定する3. Gra...
序文Linux サーバーを操作および管理するときに、最もよく使用されるコマンドの 1 つが nets...
目次1. データベースの使用を選択2. 情報を表示する3. テーブルを作成する4. データを挿入する...
目次1. システム環境2. 運用プロセスと途中で遭遇した問題1. システム環境1. Tencent ...
目次バブルソート選択ソート挿入ソート要約するバブルソートバブルソートは、シーケンスの右側から始めて、...
1. システムにログインし、ディレクトリに入ります: cd /etc/sysconfig/netwo...