解決すべき問題主にコンポーネント間のクロスレベル通信用 なぜディスパッチとブロードキャストを自分で実装する必要があるのでしょうか?独立したコンポーネントやライブラリを開発する場合、サードパーティのライブラリに依存しないのが最善です。 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 のリモート自動バックアップを実装する方法
システムド: CentOS 7のサービスsystemctlスクリプトは、/usr/lib/syste...
垂直方向では、行の配置を上、中央、下に設定できます。基本的な構文<TR VALIGN=&quo...
1. ドキュメントフローとフローティング1. ドキュメントフローとは何ですか? HTML では、ドキ...
日付ピッカーをカプセル化する場合、選択時にフォントの色を暗くする必要があります。実装後の効果を見てみ...
1. vsftpdコンポーネントをインストールするインストールコマンド: [root@ink4t ~...
プロジェクトで frameset 属性を使用したことがあるかどうかはわかりません。昨年、オンライン ...
これら 6 つの記事を書いた後、私は少し混乱し始めました。次にどこに書けばいいのか分かりません。ドメ...
この記事の例では、参考までに簡単な虫眼鏡効果を実現するためのjsの具体的なコードを共有しています。具...
#include <asm/io.h> #define ioremap(cookie,...
主にインストール後に my.ini ファイルを確認するために、msi 形式でインストールしました。フ...
序文Linux システムをインストールした後の最も一般的なタスクは、ネットワーク構成です。もちろん、...
目次Vueライフサイクルの紹介とフック機能VUEライフサイクルフックVue ライフサイクルの紹介作成...
背景クラスメートと row_id の境界問題について話し合ったので、ここで詳しく説明します。 Inn...
目次序文: 1.DEFINERの簡単な紹介2. いくつかの注意点要約:序文: MySQL データベー...
目次1.kvmの展開1.1 kvmのインストール1.2 kvm Web管理インターフェースのインスト...